Groovy中remove XML节点问题总结

遇到一个操作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数据的方式来实现该需求,以上。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeveloperMrMeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值