Java XML pharsing删除节点

时间:2016-07-22 04:43:23

标签: java xml-parsing

执行以下操作所需的Java代码。 我有一个xml作为字符串,例如

<EMpData>
<Employee1>
  <Address1>XYZ<Address1/>
  <city>DDD<city/>
<Employee1/>
<Employee2>
  <Address1><Address1/>
  <city><city/>
<Employee2/>
<EMpData/>

我必须检查是否有任何子节点为空或为空或没有值,如果有,那么我必须删除父节点和子节点。所以在上面employee2是空的,我想要下面的输出

<EMpData>
<Employee1>
  <Address1>XYZ<Address1/>
  <city>DDD<city/>
<Employee1/>
<EMpData/>

请建议最好和最有效的方法来做到这一点。实际的xml大约是500到700行。

1 个答案:

答案 0 :(得分:0)

以下是基于XPath和VTD-XML的代码..

import java.io.*;
import com.ximpleware.*;

public class removeNode2 {
    public static void main(String s[]) throws VTDException, IOException{
        VTDGen vg = new VTDGen();
        String xml = "<EMpData>\n"+
                "<Employee1>\n"+
                "<Address1>XYZ</Address1>\n"+
                "<city>DDD</city>\n"+
                "</Employee1>\n"+
                "<Employee2>\n"+
                "<Address1></Address1>\n"+
                "<city></city>\n"+
                "</Employee2>\n"+
                "</EMpData>\n";
        vg.setDoc(xml.getBytes());
        vg.parse(false);
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        XMLModifier xm = new XMLModifier(vn);
        ap.selectXPath("/EMpData/*[string-length(*/text())=0]");

        int i=0;
        while((i=ap.evalXPath())!=-1){
            //System.out.println(" -====>"+ap2.evalXPathToBoolean());
            xm.remove();
        }
        ByteArrayOutputStream baos= new ByteArrayOutputStream();
        xm.output(baos);
        System.out.println(baos.toString());
    }
}