Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从XML中提取特定节点&使用groovy创建新的XML_Xml_Groovy - Fatal编程技术网

如何从XML中提取特定节点&使用groovy创建新的XML

如何从XML中提取特定节点&使用groovy创建新的XML,xml,groovy,Xml,Groovy,acutal xml是: <prnReq> <ltrPrnReqs> <ltrPrnReq> <ltrData> <Postal>910060121</Postal> <Amt>514.17</Amt> </ltrData> </lt

acutal xml是:

<prnReq>
    <ltrPrnReqs>
        <ltrPrnReq>
            <ltrData>
                <Postal>910060121</Postal>
                <Amt>514.17</Amt>
            </ltrData>
        </ltrPrnReq>
    </ltrPrnReqs>
</prnReq>
最终XML必须仅为“ltrData”:

      <ltrData>
            <Postal>910060121</Postal>
            <Amt>514.17</Amt>
      </ltrData>
在当前代码下面,我只需要使用标记创建一个新文件,但是代码没有运行

import groovy.xml.QName
import groovy.xml.StreamingMarkupBuilder
import groovy.xml.XmlUtil

def xmlString = """
<prnReq>
    <ltrPrnReqs>
          <ltrPrnReq>
             <ltrData>
                <Postal>910060121</Postal>
                <Amt>514.17</Amt>
            </ltrData>
          </ltrPrnReq>
    </ltrPrnReqs> 
</prnReq>"""


def xml1 = new XmlSlurper().parseText(xmlString) 
def ltrD = xml1.'**'.find{it.name() == 'ltrData'}.text()

def builder = new StreamingMarkupBuilder()
builder.encoding = 'UTF-8'
def xml2 = builder.bindNode (ltrD)

def file1 = new File('C:\\Temp\\out\\ltrData.xml')
assert XmlUtil.serialize(xml2)
file1.write(xml2,'UTF-8'))
嗨@Rao,我刚刚更新了内容。当我尝试应用建议的解决方案时,我遇到了一个错误:[致命错误]:1:1:文件过早结束。。
因此,我相信我在获取内容时仍然犯了一些错误。你能看看如何获得正确的语法来获得上面两个新元素吗?非常感谢

您应该能够使用StreamingMarkupBuilder完成这项工作。并遵循在线评论:

import groovy.xml.StreamingMarkupBuilder
import groovy.xml.XmlUtil
def xmlString = """<prnReq> 
  <ltrPrnReqs>
     <ltrPrnReq>
        <ltrData>
           <Postal>910060121</Postal>
           <Amt>514.17</Amt>
        </ltrData>
     </ltrPrnReq>
   </ltrPrnReqs>
</prnReq>"""

//Extract the data you needed from existing xml
def xml1 = new XmlSlurper().parseText(xmlString) 
def ltrData1 = xml1.'**'.find{it.name() == 'ltrData'}
def nodes = ltrData1.children()*.name()

//Build the output xml
def xml = new StreamingMarkupBuilder().bind {    
    ltrData { 
       nodes.each { "$it"(ltrData1."$it".text()) }
    }
}
def file = new File('C:/Temp/out/letter_PQC301.xml')
println XmlUtil.serialize(xml)
file.write(XmlUtil.serialize(xml),'UTF-8')
​

劳尔,请检查答案,看看是否有用。我建议你编辑问题而不是答案。刚才看到,你改变了xml的结构。实际上,您是否需要从现有xml中提取任何数据并将其用于新的xml中?您好@Rao,是的,我只需要新xml文件中的“ltrData”内容。似乎不需要引用现有的xml。让我更新答案。
import groovy.xml.StreamingMarkupBuilder
import groovy.xml.XmlUtil
def xmlString = """<prnReq> 
  <ltrPrnReqs>
     <ltrPrnReq>
        <ltrData>
           <Postal>910060121</Postal>
           <Amt>514.17</Amt>
        </ltrData>
     </ltrPrnReq>
   </ltrPrnReqs>
</prnReq>"""

//Extract the data you needed from existing xml
def xml1 = new XmlSlurper().parseText(xmlString) 
def ltrData1 = xml1.'**'.find{it.name() == 'ltrData'}

def file = new File('C:/Temp/out/letter_PQC301.xml')
println XmlUtil.serialize(ltrData1)
file.write(XmlUtil.serialize(ltrData1),'UTF-8')