1、分割已有xml文档(parent.xml)
要求:将parent.xml文件以指定标签中的 comp_name属性进行分割,相同属性放入同一文件中。
分割部分代码:
//1.获取工厂
DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
//2.产生解析器
DocumentBuilder builder=factory.newDocumentBuilder();
File file = new File("parent.xml");
//3.解析xml文档,得到代表文档的document对象
Document document=builder.parse(file);
//以下部分为了简洁,获取的节点名和List中顺序均已写死,为保证代码健壮性,建议各位用遍历和判断的方式
NodeList nodelist = document.getElementsByTagName("purchaseOrder");
//获取三个节点()
Node ABCNode1 = nodelist.item(0);
Node IBMNode = nodelist.item(1);
Node ABCNode2 = nodelist.item(2);
2、拼接xml节点产生新文件
将分割后的节点进行拼接,生成新的文件并输出:
//创建新的xml并输出
Document documentABC = builder.newDocument();
//转换源文件的节点
Node nodeABC1 = documentABC.adoptNode(ABCNode1);
Node nodeABC2 = documentABC.adoptNode(ABCNode2);
//创建跟节点
Element rootElementABC = documentABC.createElement("purchaseOrders");
Element childElementABC = documentABC.createElement("ABC_COMP");
//拼装新的xml各个节点
documentABC.appendChild(rootElementABC);
rootElementABC.appendChild(childElementABC);
childElementABC.appendChild(nodeABC1);
childElementABC.appendChild(nodeABC2);
Document documentIBM = builder.newDocument();
//转换源文件的节点
Node nodeIBM = documentIBM.adoptNode(IBMNode);
//创建跟节点
Element rootElementIBM = documentIBM.createElement("purchaseOrders");
Element childElementIBM = documentIBM.createElement("IBM_COMP");
//拼装新的xml各个节点
documentIBM.appendChild(rootElementIBM);
rootElementIBM.appendChild(childElementIBM);
childElementIBM.appendChild(nodeIBM);
//将内存中修改后的doucement写入xml文档
//获取工厂
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
//设置编码等文件信息
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF8");
//创建输出
DOMSource domSourceABC = new DOMSource(documentABC);
StreamResult resultABC = new StreamResult(new File("ABC_COMP.xml"));
DOMSource domSourceIBM = new DOMSource(documentIBM);
StreamResult resultIBM = new StreamResult(new File("IBM_COMP.xml"));
try{
transformer.transform(domSourceABC, resultABC);
transformer.transform(domSourceIBM, resultIBM);
}catch(TransformerException e){
e.printStackTrace();
}
注意:获取分割后的节点,放入新创建的文本节点中时,必须调用 Document 的 adoptNode()方法,否则会报文本节点不一致异常。