手工构建的w3c文档文本节点会导致奇怪的行为

时间:2011-08-10 01:41:58

标签: java dom document

以下代码会导致输出类似于以下内容:

<parent>
  <child/>  
  <secondChild/>  ...

我希望它看起来如下:

<parent>  
parent text  
<child></child>  
<secondChild>second child text</secondChild>   

有问题的代码如下:

Element parentNode= document.createElement("parent");
Text textNode = document.createTextNode("parent text");
Element childNode = document.createElement("child");
parentNode.appendChild(childNode);
childNode.appendChild(textNode);
childNode = document.createElement("secondChild");
textNode = document.createTextNode("second child text");
parentNode.appendChild(childNode);
childNode.appendChild(textNode);

我的问题是,在构建文档时,重新引用导致问题的textNode会遗漏一些内容吗?

2 个答案:

答案 0 :(得分:1)

是的,你不能重用任何节点。在DOM中,每个节点都有一个父节点,并且只有一个父节点,一旦附加节点(无论是文本节点还是元素),该节点就会附加,如果不先分离,则不应该附加到任何其他父节点。

DOM相当古老,并不是使用xml最简单的方法,不是在java或任何其他平台上(因为它是几乎所有平台上都相同的标准接口)。

你试过jdom还是dom4j?

答案 1 :(得分:1)

它对我有效。也许你的打印方式有问题吗?试试这个:

import org.w3c.dom.*;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;

public class ThrowawayCode {
    public static void main(String[] args) throws Exception {
        Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
        Element parentNode = document.createElement("parent");
        document.appendChild(parentNode);
        Text textNode = document.createTextNode("parent text");
        Element childNode = document.createElement("child");
        parentNode.appendChild(childNode);
        childNode.appendChild(textNode);
        childNode = document.createElement("secondChild");
        textNode = document.createTextNode("second child text");
        parentNode.appendChild(childNode);
        childNode.appendChild(textNode);

        Source source = new DOMSource(document);
        StringWriter writer = new StringWriter();
        Result result = new StreamResult(writer);
        TransformerFactory.newInstance().newTransformer().transform(source, result);
        System.out.println(writer.toString());
    }
}

输出:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><parent><child>parent text</child><secondChild>second child text</secondChild></parent>

编辑:如果您的意思是想要将第一个文本放在孩子之外而不是在其中,则需要将代码更改为:

Text textNode = document.createTextNode("parent text");
Element childNode = document.createElement("child");
parentNode.appendChild(textNode);
parentNode.appendChild(childNode);

但我认为你错误输入了XML。