如果我有一个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吗?
尝试使用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
| 归档时间: |
|
| 查看次数: |
401 次 |
| 最近记录: |