Ручной сборка w3c Document Text вызывает странное поведение - PullRequest
1 голос
/ 10 августа 2011

Следующий код вызывает вывод, похожий на следующий:

<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 ]

1 голос
/ 10 августа 2011

Это работает, как и ожидалось для меня. Может быть, есть проблема с тем, как вы печатаете это? Попробуйте это:

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.

1 голос
/ 10 августа 2011

да, вы не можете повторно использовать любой узел. В DOM каждый узел имеет родителя и только одного родителя: после того, как вы присоедините узел (будь то текстовый узел или элемент), этот узел присоединяется и не должен быть присоединен к любому другому родительскому узлу, если он не отсоединен первым.

DOM довольно древний и не самый простой способ работы с xml, ни в java, ни на любой другой платформе (поскольку это стандартный интерфейс, который одинаков почти на всех платформах).

Вы пробовали jdom или dom4j?

...