在Java中解析DOM

she*_*158 -11 java xml dom

如果我有一个xml文件如下,

<a> <b></b> <d> <c></c> </d></a>
Run Code Online (Sandbox Code Playgroud)

我希望能够将其分解为三个xml,如下所示,

<a> <b></b> <d></d> </a>

<c></c>

<a> <d></d> </a>
Run Code Online (Sandbox Code Playgroud)

这可能使用DOM吗?

Bha*_*tel 6

尝试使用VTD解析器(需要ximpleware jar)..

给..

<a> <b></b> <d> <c></c> </d></a>
Run Code Online (Sandbox Code Playgroud)

下面的代码将生成四个文件(一个用于临时使用),其中三个将具有所需的输出.

<a> <b></b> <d></d> </a>

<c></c>

<a> <d></d> </a> 
Run Code Online (Sandbox Code Playgroud)

注意:这可以更好地修改和实现,但给出了基本思路.

 // bunch of imports
public class vtd {

public static void main(String[] args) throws ModifyException, NavException, FileNotFoundException, IOException, TranscodeException {

    VTDGen vg = new VTDGen(); // Instantiate VTDGen
    XMLModifier xm = new XMLModifier(); //Instantiate XMLModifier
    XMLModifier xm1 = new XMLModifier();
    XMLModifier xm2 = new XMLModifier();
    //parse the main file
    vg.parseFile("e://test.xml", true);
    VTDNav vn = vg.getNav();
    vn.toElement(VTDNav.FIRST_CHILD);
    vn.toElement(VTDNav.NS);
    // check if the file has a node <c>
    if (vn.toElement(VTDNav.FIRST_CHILD, "c")) {

        if (vg.parseFile("e://test.xml", false)) {
            vn = vg.getNav(); // instantiate navigation opject
            xm.bind(vn);
            xm1.bind(vn);
            vn.toElement(VTDNav.FIRST_CHILD);
            if (vn.toElement(VTDNav.NS, "d")) {
                long l = vn.getContentFragment();
                xm.remove(l); // remove the node <c>  
            }
            vn.toElement(VTDNav.ROOT);
            vn.toElement(VTDNav.FIRST_CHILD);
            long l = vn.getContentFragment();
            xm1.remove(); // remove the node <b>  to save it in a temp file
            xm.output(new FileOutputStream("E://new.xml")); // generate the first file
            xm1.output(new FileOutputStream("E://newonetemp.xml"));
        }
        // prase the temp file
        if (vg.parseFile("e://newonetemp.xml", false)) {
            vn = vg.getNav();
            xm2.bind(vn);
            vn.toElement(VTDNav.FIRST_CHILD);
            vn.toElement(VTDNav.FIRST_CHILD);

            long l = vn.getContentFragment();
            xm2.remove(); // remove the node <b>
            xm2.output(new FileOutputStream("E://newtwo.xml")); // generate the next file
        }
        if (vg.parseFile("e://test.xml", false)) {
            vn = vg.getNav();

            vn.toElement(VTDNav.FIRST_CHILD);

            vn.toElement(VTDNav.NEXT_SIBLING);

            if (vn.matchElement("d")) {
                long l = vn.getContentFragment();
                String one = vn.toString((int) l, 8); // get the framgment <c></c>
                FileWriter fileWriter = new FileWriter("e://three.xml");
                BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
                bufferedWriter.write(one); // create the last file
                bufferedWriter.close();
            }
        }
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:更新条件:xml应该有节点c