JAVA - 如何使用StAX基于子节点从xml中删除父节点

时间:2017-04-10 19:50:02

标签: java xml stax

我在Java中处理xml消息,我需要根据子节点的属性从子节点中删除父节点。

<xml>
   <A>
     <B>
       <C>
         <E>11</E>
         <F>12</F>
       </C>
    </B>
    <B>
       <C>
         <E>13</E>
         <F>14</F>
      </C>
    </B>
  </A>

例如,如果E = 13,如何删除整个B节点。这对于一些内存中的方法(例如DOM)来说是一项微不足道的任务,但由于性能问题,我需要使用StAX来解析xml消息的顶部。如何使用StAX完成此操作?非常感谢你。

3 个答案:

答案 0 :(得分:1)

下面是当C / E为13时删除B节点的代码。它在vtd-xml和xpath中完成。性能明智的VTD-XML比DOM更好。此代码将轻松处理您的大型xml文件。如果您想了解更多信息,请阅读本学术论文。

http://sdiwc.net/digital-library/request.php?article=0d947fb50e2f0160a75ac9f6bbf0818a

import com.ximpleware.*;
public class removeParent {
    public  static void main(String[] s) throws VTDException,java.io.IOException{
        VTDGen vg = new VTDGen();
        if (vg.parseFile("d:\\xml\\remove.xml",false)){
            VTDNav vn = vg.getNav();
            AutoPilot ap = new AutoPilot(vn);
            XMLModifier xm = new XMLModifier(vn);
            ap.selectXPath("/xml/A/B[C/E='13']");
            int i=0;
            while((i=ap.evalXPath())!=-1){
                xm.remove();
                //System.out.println("ok");
            }
            xm.output("d:\\xml\\updated.xml");
        }
    }
}

答案 1 :(得分:0)

我看到两个选项:

  • 您有足够的内存来存储整个<B>; 基本上只是将片段存储在内存中,直到您获得有关<E>的信息并将其写入输出(或不要)

  • 您没有足够的内存但可以将xml流式传输两次。第一遍:记住哪个<B>保留哪个不(通过xml出现,例如先保留,跳过第二个,保持第三个aso。一个bitset将是一个很好的数据结构)。第二遍:根据bitset中记忆的值保持/跳过。

答案 2 :(得分:0)

正如您所观察到的,StaX严格按顺序处理事件。如果要删除子树,则需要编写自己的代码来缓冲足够的事件,并且需要有足够的内存来保存该缓冲区。 StaX API中的任何内容都不会帮助(或阻碍)您完成此任务。