【问题标题】:JAVA - How to remove parent nodes from xml based on child nodes using StAXJAVA - 如何使用 StAX 基于子节点从 xml 中删除父节点
【发布时间】:2017-04-10 19:50:02
【问题描述】:

我在 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 完成此任务?非常感谢您。

【问题讨论】:

    标签: java xml stax


    【解决方案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");
            }
        }
    }
    

    【讨论】:

    • 但是从我所看到的 VTD-XML 也将 xml 保存在内存中,不是吗?这对我来说是一个瓶颈,因为我将处理相当大的 xml 消息,并且没有内存资源将这些消息保存在内存中。
    • 我去看看。谢谢!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我看到两个选项:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多