我在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完成此操作?非常感谢你。
答案 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)