复制节点在同一个输出xml文件-java [英] Copy nodes in the same output xml file -java
问题描述
1.这是我的示例文件example.xml
1.This is my example file "example.xml"
<?xml version="1.0" encoding="UTF-8"?>
<VER>7.0</VER>
<NATIONALITY>FIN</NATIONALITY>
<DATA>
<USER>ED</USER>
<PLZ>XXX</PLZ>
<BEGIN>2015-05-16</BEGIN>
<CURRENCY>90</CURRENCY>
<MARKE>KIA</MARKE>
<DATA>
2.这是我的java代码解析文件example.xml:
2.This is my java code that parses the file "example.xml" :
public static void main(String argv[]) {
try {
Properties prop = System.getProperties();
File file = new File("E:/workspace/example.xml");
DocumentBuilderFactory dbildfactory =DocumentBuilderFactory.newInstance();
DocumentBuilder dbild = dbildfactory.newDocumentBuilder();
Document doc = dbild.parse(file);
doc.getDocumentElement().normalize();
NodeList nodeL = doc.getElementsByTagName("ALL");
for (int s = 0; s < nodeL.getLength(); s++) {
Node nodde = nodeL.item(s);
if (nodde.getNodeType() == Node.ELEMENT_NODE){
Element fstElmnt = (Element) nodde;
NodeList list = fstElmnt.getElementsByTagName("MARKE");
Element disp = (Element) list.item(0);
NodeList dispmarke = disp.getChildNodes();
System.out.println("<MARKE>" + ((Node)
dispmarke.item(0)).getNodeValue() + "</MARKE>");
String dispbrd = prop.getProperty("prop4");
((Node) dispmarke.item(0)).setNodeValue(dispbrd);
System.out.println("<MARKE>" + ((Node)
dispmarke.item(0)).getNodeValue() + "</MARKE>");
if(dispmarke.item(0).getNodeValue().equals("LEX") ){
NodeList nod = fstElmnt.getElementsByTagName("MARKE");
Element element = (Element) nod.item(0);
NodeList mod = element.getChildNodes();
System.out.println("<MARKE>" + ((Node) mod.item(0)).getNodeValue() + "</MARKE>");
prop.put("norm", "X300");
((Node) mod.item(0)).setNodeValue(prop.getProperty("norm"));
System.out.println("<MARKE>" + ((Node) mod.item(0)).getNodeValue() + "</MARKE>");
}
}
}
TransformerFactory transformerFactory =
TransformerFactory.newInstance();
Transformer transformer =
transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(doc);
StreamResult console = new StreamResult(System.out);
StreamResult fil = new StreamResult(new File("E:/workspace/res/output.xml"));
transformer.transform(source, console);
transformer.transform(source, fil);
}
catch (Exception e) {
e.printStackTrace();
}
}
3.此时,节点保存到一个新文件output.xml:
3.At this time, the nodes are saved to a new file "output.xml":
<?xml version="1.0" encoding="UTF-8"?>
<ALL>
<VER>7.0</VER>
<NATIONALITY>FIN</NATIONALITY>
<DATA>
<USER>ED</USER>
<PLZ>XXX</PLZ>
<BEGIN>2015-05-16</BEGIN>
<CURRENCY>90</CURRENCY>
<MARKE>KIA</MARKE>
<DATA>
</ALL>
4.我想要的是,文件output.xml中有几个节点副本。
此节点在上一个节点之后启动的每个人:
4.I would like that, there were several copies of nodes in file output.xml. Everyone this node started after the last node:
<?xml version="1.0" encoding="UTF-8"?>
<ALL>
<VER>7.0</VER>
<NATIONALITY>FIN</NATIONALITY>
<DATA>
<USER>ED</USER>
<PLZ>XXX</PLZ>
<BEGIN>2015-05-16</BEGIN>
<CURRENCY>90</CURRENCY>
<MARKE>KIA</MARKE>
<DATA>
</ALL>
<ALL>
<VER>7.0</VER>
<NATIONALITY>FIN</NATIONALITY>
<DATA>
<USER>ED</USER>
<PLZ>XXX</PLZ>
<BEGIN>2015-05-16</BEGIN>
<CURRENCY>90</CURRENCY>
<MARKE>KIA</MARKE>
<DATA>
</ALL>
...
5.如何在Java中最简单的方法?为什么循环?
5.How can the easiest way to do this in Java? What loops used for this?
推荐答案
我不得不修改你的输入XML来创建根元素:
I had to fix your input XML to have a root element:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<VER>7.0</VER>
<NATIONALITY>FIN</NATIONALITY>
<DATA>
<USER>ED</USER>
<PLZ>XXX</PLZ>
<BEGIN>2015-05-16</BEGIN>
<CURRENCY>90</CURRENCY>
<MARKE>KIA</MARKE>
</DATA>
</ROOT>
然后我可以使用 XMLBeam (一个数据投影库,披露:我隶属于这个项目)到
Then I could use XMLBeam (A data projection library, DISCLOSURE: I'm affiliated with this project) to
- 读取输入,
- 将其包装成
全部
元素 - 复制输入和
- 打印出来
- read the input,
- wrap it into an
ALL
Element - duplicate the input and
- print it out
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import org.xmlbeam.XBProjector;
import org.xmlbeam.XBProjector.Flags;
import org.xmlbeam.annotation.XBWrite;
import org.xmlbeam.dom.DOMAccess;
@SuppressWarnings("javadoc")
public class DuplicateNode {
// Projection to embed some nodes into an "ALL" element
public interface AllNodes {
@XBWrite("./*")
AllNodes setNodes(List<DOMAccess> nodes);
};
// Projection for the output document
public interface OutputProjection {
@XBWrite("/ROOT/*")
void setNodes(List<AllNodes> nodes);
};
public static void main(String[] args) throws IOException {
// Create the projector we will use to project the data
XBProjector projector = new XBProjector(Flags.TO_STRING_RENDERS_XML);
//Read all nodes from input document
List<DOMAccess> nodes =projector.io().url("res://example.xml").evalXPath("/ROOT/*").asListOf(DOMAccess.class);
// Create some copies
List<AllNodes> newNodeList = new LinkedList<AllNodes>();
newNodeList.add(projector.projectEmptyElement("ALL",AllNodes.class).setNodes(nodes));
newNodeList.add(projector.projectEmptyElement("ALL",AllNodes.class).setNodes(nodes));
//...
// Create an output projection that will take the copied nodes
OutputProjection outputProjection = projector.projectEmptyDocument(OutputProjection.class);
// set nodes to the output projection
outputProjection.setNodes(newNodeList);
// print it out (or write to file, stream,...)
System.out.println(outputProjection);
}
}
此程序打印出来:
<ROOT>
<ALL>
<VER>7.0</VER>
<NATIONALITY>FIN</NATIONALITY>
<DATA>
<USER>ED</USER>
<PLZ>XXX</PLZ>
<BEGIN>2015-05-16</BEGIN>
<CURRENCY>90</CURRENCY>
<MARKE>KIA</MARKE>
</DATA>
</ALL>
<ALL>
<VER>7.0</VER>
<NATIONALITY>FIN</NATIONALITY>
<DATA>
<USER>ED</USER>
<PLZ>XXX</PLZ>
<BEGIN>2015-05-16</BEGIN>
<CURRENCY>90</CURRENCY>
<MARKE>KIA</MARKE>
</DATA>
</ALL>
</ROOT>
这篇关于复制节点在同一个输出xml文件-java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!