我正在尝试用Java编写XML文件。我希望有一个字符串数组填充元素名称,如下所示:String[] elements = {"a", "b", "c", "d"};
我想有一个for循环,它将迭代数组并使第一个元素成为根元素的子元素,第二个元素第一个孩子,第三个孩子,第二个孩子,等等。
目标是拥有一个如下所示的XML文件:
<root>
<a>
<b>
<c>
<d>
</d>
</c>
</b>
</a>
</root>
到目前为止,这是我的Java代码:
package test;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class Test {
public static void main(String[] args) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
Element root = document.createElement("root");
document.appendChild(root);
String[] elements = {"a", "b", "c", "d"};
for (int i = 0; i < elements.length; i++) {
Element element = document.createElement(elements[i]);
root.appendChild(element);
}
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File("C:/test.xml"));
transformer.transform(source, result);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
现在for-loop只是将数组中的所有元素附加到根目录,因此XML文件看起来像:
<root>
<a/>
<b/>
<c/>
<d/>
</root>
我想要一个for循环,它使每个元素成为前一个元素的子元素。
答案 0 :(得分:2)
问题是您要将每个XML元素附加到根元素而不是新创建的元素。
对代码的最小更改是将root
设置为新创建的元素:
for (int i = 0; i < elements.length; i++) {
Element element = document.createElement(elements[i]);
root.appendChild(element);
root = element; // <-- updates the root element to the newly created element
}
这样,每个创建的元素都将附加到最后一个元素。
输出:
<root>
<a>
<b>
<c>
<d />
</c>
</b>
</a>
</root>
答案 1 :(得分:2)
您将所有元素附加到根目录,而不是相互附加。试试这个:
String[] elements = {"a", "b", "c", "d"};
Element current = root;
for (int i = 0; i < elements.length; i++) {
Element element = document.createElement(elements[i]);
current.appendChild(element);
current = element;
}
答案 2 :(得分:0)
定义一个元素来指定始终包含前一个子元素的子元素,如下所示:
Element previous = root; //define element to hold previous one
for (int i = 0; i < elements.length; i++) {
Element element = document.createElement(elements[i]);
previous.appendChild(element); //assighn current to previous element
previous = element; // reassign previous for next round
}