遇到一个操作xml的需求,demo数据如下:
<Root>
<HEAD>
<item>
<BUKRS>1000</BUKRS>
<ORDER>41000000</ORDER>
<ITEMS>
<item>
<POSNR>00001</POSNR>
<MATERIAL>TEST-562348</MATERIAL>
<PLANT>100J</PLANT>
</item>
<item>
<POSNR>00002</POSNR>
<MATERIAL>TEST-FETETSS</MATERIAL>
<PLANT>100G</PLANT>
</item>
</ITEMS>
</item>
<item>
<BUKRS>1200</BUKRS>
<ORDER>41000001</ORDER>
<ITEMS>
<item>
<POSNR>00001</POSNR>
<MATERIAL>TEST-5FSDFSA</MATERIAL>
<PLANT>100J</PLANT>
</item>
<item>
<POSNR>00002</POSNR>
<MATERIAL>TEST-DAEQEASD</MATERIAL>
<PLANT>100G</PLANT>
</item>
</ITEMS>
</item>
</HEAD>
</Root>
需求是,HEAD下面的item有几条,我就需要拆成几份XML,每份XML中只包含对应的那一份数据,想要的结果如下:
第一份XML
===============================================
<?xml version="1.0" encoding="UTF-8"?><Root>
<HEAD>
<item>
<BUKRS>1000</BUKRS>
<ORDER>41000000</ORDER>
<ITEMS>
<item>
<POSNR>00001</POSNR>
<MATERIAL>TEST-562348</MATERIAL>
<PLANT>100J</PLANT>
</item>
<item>
<POSNR>00002</POSNR>
<MATERIAL>TEST-FETETSS</MATERIAL>
<PLANT>100G</PLANT>
</item>
</ITEMS>
</item>
</HEAD>
</Root>
第二份XML
===============================================
<?xml version="1.0" encoding="UTF-8"?><Root>
<HEAD>
<item>
<BUKRS>1200</BUKRS>
<ORDER>41000001</ORDER>
<ITEMS>
<item>
<POSNR>00001</POSNR>
<MATERIAL>TEST-5FSDFSA</MATERIAL>
<PLANT>100J</PLANT>
</item>
<item>
<POSNR>00002</POSNR>
<MATERIAL>TEST-DAEQEASD</MATERIAL>
<PLANT>100G</PLANT>
</item>
</ITEMS>
</item>
</HEAD>
</Root>
最终实现代码:
def body = """
<Root>
<HEAD>
<item>
<BUKRS>1000</BUKRS>
<ORDER>41000000</ORDER>
<ITEMS>
<item>
<POSNR>00001</POSNR>
<MATERIAL>TEST-562348</MATERIAL>
<PLANT>100J</PLANT>
</item>
<item>
<POSNR>00002</POSNR>
<MATERIAL>TEST-FETETSS</MATERIAL>
<PLANT>100G</PLANT>
</item>
</ITEMS>
</item>
<item>
<BUKRS>1200</BUKRS>
<ORDER>41000001</ORDER>
<ITEMS>
<item>
<POSNR>00001</POSNR>
<MATERIAL>TEST-5FSDFSA</MATERIAL>
<PLANT>100J</PLANT>
</item>
<item>
<POSNR>00002</POSNR>
<MATERIAL>TEST-DAEQEASD</MATERIAL>
<PLANT>100G</PLANT>
</item>
</ITEMS>
</item>
</HEAD>
</Root>
"""
String fileContent = new String(body.getBytes())
XmlParser xmlParser = new XmlParser()
//设置忽略名称空间(ns1:http://****)
xmlParser.setNamespaceAware(false)
def xml = xmlParser.parseText(fileContent)
//获取文件数
int FileNo = xml.HEAD.item.size();
def NewXml
int index = 0
def NewXmlList = []
def resultXml
while(FileNo > 0){
NewXml = xmlParser.parseText(fileContent)
// NewXml = xml.clone()
//清空明细数据
NewXml.HEAD.item.each{
it.parent().remove(it)
}
//赋值对应行的明细内容
NewXml.HEAD[0].append(xml.HEAD.item[index])
//序列化XML内容
resultXml = groovy.xml.XmlUtil.serialize(NewXml)
NewXmlList.add(resultXml)
index++
FileNo--
}
做的过程中遇到一点问题,最开始我的写法如下,但是无法正确移除对应节点:
NewXml = xml.clone()
// 清空明细数据
NewXml.HEAD.item.each{
// it.parent().remove(it)
NewXml.HEAD.remove(it)
}
问题就处在clone方法上,clone出来的方法无法获取到父节点,调用parent()获取的结果是null,导致无法通过remove来移除对应节点
所以最终采用每次在循环中重新解析来拿到新的XML数据的方式来实现该需求,以上。