XML добавление того же элемента, что и дочерний элемент (получение HIERARCHY_REQUEST_ERR) - PullRequest
1 голос
/ 13 марта 2012

Как добавить тот же элемент, что и у ребенка. Я хочу что-то вроде этого:

<family>
  <parent name = "P1">
    <child name = "P1C1">
        <child name = "P1C1C1"/>
        <child name = "P1C1C2"/>
    </child>
    <child name = "P1C2"/>
    <child name = "P1C3">
      <child name = "P1C3C1"/>
    </child>
  </parent>
  <parent name = "P2">
    <child name = "P2C1">
        <child name = "P2C1C1"/>
    </child>
    <child name = "P2C2">
        <child name = "P2C2C1"/>
    </child>
  </parent>
</family>

Если я пытаюсь создать дочерний элемент и добавить к нему еще один дочерний элемент, я получаю:

HIERARCHY_REQUEST_ERR: была предпринята попытка вставить узел, где это не разрешено.

Как мы можем сгенерировать вышеуказанное дерево XML?

Также посмотрите более широкую картину для решения, которое я строю: Создание XML-сопоставления рекурсивного поиска в каталоге

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
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 ChildofChildXML {

    public static void main(String[] args) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = factory.newDocumentBuilder();
            Document doc = docBuilder.newDocument();
            Element root = doc.createElement("family");   
            doc.appendChild(root);   

            Element parent = doc.createElement("parent");
            parent.setAttribute("name","P1");
            root.appendChild(parent);

            Element childElement = doc.createElement("child");
            childElement.setAttribute("name","P1C1");
            parent.appendChild(childElement);


            Element childElement2 = doc.createElement("child"); //Works
            childElement2.setAttribute("name","P1C1C1");
            childElement.appendChild(childElement2);

            /*
            childElement = doc.createElement("child");
            childElement.setAttribute("name","P1C1C1");

            // Not allowed - HIERARCHY_REQUEST_ERR: 
            childElement.appendChild(childElement); 
            */

            childElement = doc.createElement("child");
            childElement.setAttribute("name","P1C2");
            parent.appendChild(childElement);

            TransformerFactory tranFactory = TransformerFactory.newInstance();
            Transformer aTransformer = tranFactory.newTransformer();
            aTransformer.setOutputProperty("indent", "yes");

            Source src = new DOMSource(doc);
            Result dest = new StreamResult(System.out);
            aTransformer.transform(src, dest);  
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

Теперь код должен быть объединен с рекурсивным вызовом 'раскрыть архив', и именно здесь я задаюсь вопросом, как добавить дочерний элемент потомства, поскольку мне нужно применить решение к рекурсии - где я расширяю архивный файл верхнего уровня. используя java.util.zip. Здесь эквивалент папки, содержащей архив верхнего уровня, являющейся родительским и последующими узлами, рекурсивно эквивалентен содержимому архивов. Так что у уха может быть война или банка. Война может иметь jsp под ней, и WEB-INF / lib / x.jar и WEB-INF / lib / x.jar необходимо снова развернуть и так далее, и эти отношения ребенок -> ребенок -> ребенок должны быть построен из родителей.

Ответы [ 2 ]

4 голосов
/ 13 марта 2012

Это проблема:

childElement.appendChild(childElement);

Вы пытаетесь добавить дочерний элемент к себе . Вы не можете сделать это. Это не имеет никакого смысла ... элемент не может быть ребенком сам по себе. Как вы ожидаете, что это будет представлено в окончательном XML?

Если вы измените этот код на

parent.appendChild(childElement);

или

childElement2.appendChild(childElement);

тогда все нормально.

1 голос
/ 13 марта 2012

Вы можете добавить узел <child> в качестве дочернего к <parent> и другим узлам <child>. Не разрешается добавлять его в <family> или непосредственно в документ. (грубое предположение - мне нужно увидеть схему или DTD)


Второе - если вы создаете элементы для документа, всегда используйте этот шаблон:

Element element = doc.createElement("child");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...