我在ArrayList对象中有XML元素的值。我必须创建XML文件,其结构如下:具有子节点的元素。
数字、名称和级别分别添加到数组对象alNumber、alName和alLevel中。值按以下顺序添加到数组列表对象中。
alNumber.get(1)=0000000042
alName.get(1)=Test Part2
alLevel.get(1)=1
alNumber.get(2)=0000000022
alName.get(2)=Test3243
alLevel.get(2)=1
alNumber.get(3)=0000000061
alName.get(3)=testpartsub
alLevel.get(3)=1
alNumber.get(4)=0000000083
alName.get(4)=testpartsub4
alLevel.get(4)=2
.
以下是XML文件的输出:
<?xml version="1.0" encoding="UTF-8"?>
<node name="Test Par1" number="0000000041">
<node name="Test Part2" number="0000000042"/> //Level - 1
<node name="Test3243" number="0000000022"/>
<node name="testpartsub" number="0000000061">
<node name="testpartsub4" number="0000000083"/> //<Level -2
<node name="testpartsub1" number="0000000081">
<node name="Test1" number="0000000001"/> //Level -3
<node name="Testpartsub3" number="0000000082">
<node name="Test2" number="0000000021"/> //Level - 4
</node>
</node>
</node>
<node name="testpartsub2" number="0000000062"/>
<node name="Test Part4" number="0000000044">
<node name="testpart4sub1" number="0000000084"/>
</node>
<node name="Test Part3" number="0000000043">
<node name="Test Part5" number="0000000045"/>
<node name="Test Part6" number="0000000046">
<node name="Test334344" number="0000000047"/>
<node name="Test Part4" number="0000000044">
<node name="testpart4sub1" number="0000000084"/>
</node>
</node>
</node>
<node name="Testpartsub3" number="0000000082">
<node name="Test2" number="0000000021"/>
</node>
</node>
这是我的代码:
DocumentBuilderFactory xmlDocFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder xmlDocBuilder = xmlDocFactory.newDocumentBuilder();
System.out.println("**Creating XML File ...");
xmlDocument = xmlDocBuilder.newDocument();
rootElement = xmlDocument.createElement("node");
rootElement.setAttribute("number", wtpart.getNumber());
rootElement.setAttribute("name", wtpart.getName());
xmlDocument.appendChild(rootElement);
Iterator<Integer> iter = alLevel.iterator();
for (int i=1, j=i+1; i<alNumber.size() && i<alName.size() && i<alLevel.size(); i++,j++) {
if (alLevel.get(i) == 1) {
Element element = xmlDocument.createElement("node");
element.setAttribute("number", alNumber.get(i));
element.setAttribute("name", alName.get(i));
rootElement.appendChild(element);
prevElement = element;
}
else if (j<=i) {
if (alLevel.get(j)>alLevel.get(i)){
if (alLevel.get(j) != 1) {
Element element = xmlDocument.createElement("node");
element.setAttribute("number", alNumber.get(i));
element.setAttribute("name", alName.get(i));
prevElement.appendChild(element);
prevElement = element;
}}
else {
Element element = xmlDocument.createElement("node");
element.setAttribute("number", alNumber.get(i));
element.setAttribute("name", alName.get(i));
prevElement.appendChild(element);
}
}
else {
Element element = xmlDocument.createElement("node");
element.setAttribute("number", alNumber.get(i));
element.setAttribute("name", alName.get(i));
prevElement.appendChild(element);
}
}
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
DOMSource source = new DOMSource(xmlDocument);
StreamResult result = new StreamResult(new File("E:\\temp", "Test.xml") );
transformer.transform(source, result);
发布于 2017-11-07 09:11:03
谢谢奥本兰。它在n级上是这样工作的。
for (int i = 0; i < alNumber.size(); i++) {
int currentLevel = alLevel.get(i);
Element node = xmlDocument.createElement("node");
node.setAttribute("number", alNumber.get(i));
node.setAttribute("name", alName.get(i));
int levelDifference = previousLevel - currentLevel + 1;
while(levelDifference > 0 ) {
elementStack.remove(elementStack.size() - 1);
levelDifference--;
}
if(i == 0) {
xmlDocument.appendChild(node);
} else {
Element parentElement = elementStack.get(currentLevel - 1);
parentElement.appendChild(node);
elementStack.set(currentLevel - 1, parentElement);
}
elementStack.add(node);
previousLevel = currentLevel;
}
发布于 2017-04-21 02:51:41
我认为您的代码不起作用,因为您正在描述问题的第1级和第2级的特殊情况。现在您必须添加代码来处理第3级和第4级等等。但是1337级呢?是否要为1337级以下的每个级别编写额外的代码?我不这样认为。尝试提取最常见的场景:
我是级别n上的XML元素,有一个新元素要添加到级别m中.
要添加一个新元素,我必须走到应该添加新元素的级别之上的元素。所以级别m - 1。新元素将被添加,然后我是级别m上的新元素。
您可以使用getParentNode()进行一级升级。
所以你需要两个嵌套的for-循环。第一个迭代在您的列表上,第二个应该用来将n-(m-1)级别提高。
从根元素开始,n= 0。
https://stackoverflow.com/questions/43535897
复制