如何使用for循环编写XML文件以将元素追加到前一个元素

时间:2015-12-17 14:34:34

标签: java xml

我正在尝试用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循环,它使每个元素成为前一个元素的子元素。

3 个答案:

答案 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
}