Реализация списка‹Node›

Я решил реализовать Abstract List<Node> . вот кусок этого:

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

    public class myNodeList implements NodeList{


    Node root = null;
    int length = 0;

    public myNodeList() {}   
    public void addNode(Node node) {  
        if(root == null)   
        {
            root = node;  
               }
          else          
         root.appendChild(node);   
        length++;   
        System.out.println("this is the added node " +node);
    }      
     } 

но когда я пытаюсь add узел, это дает мне следующее исключение:

Exception in thread "main" org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted. 
at com.sun.org.apache.xerces.internal.dom.NodeImpl.insertBefore(NodeImpl.java:478)
at com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild(NodeImpl.java:235)
at pageparsertest.myNodeList.addNode(myNodeList.java:27)

это из-за Node root = null;, который заставляет добавить узел к нулевому узлу? тогда как можно исправить


person seventeen    schedule 22.12.2014    source источник


Ответы (2)


Вы не можете добавить к com.sun.org.apache.xerces.internal.dom.NodeImpl, вам нужно будет использовать com.sun.org.apache.xerces.internal.dom.ParentNode.

appendChild вызовет insertBefore, который выдает только Exception вместо NodeImpl

Исходный код

Переместите один или несколько узлов в наш список дочерних элементов. Обратите внимание, что это неявно удаляет их из предыдущего родителя.

По умолчанию мы не принимаем никаких дочерних элементов, ParentNode переопределяет это.

Посмотрите, как Axis реализовал свои : http://grepcode.com/file/repo1.maven.org/maven2/com.ning/metrics.collector/1.0.2/org/apache/axis/message/NodeListImpl.java

Кажется, вы пытаетесь построить дерево узлов, используя первый узел в качестве корня, а не список узлов. Что невозможно, если ваши узлы NodeImpl не ParentNode.

Если вам нужно дерево, вам придется каким-то образом создать (или импортировать) родительский узел. Если вам просто нужен список, используйте List.


Возможно, вам придется создать фальшивый пользовательский родитель, чтобы вставить свои узлы. Взгляните сюда: HIERARCHY_REQUEST_ERR при попытке добавить элементы в XML-файл в цикле for

person Michael Laffargue    schedule 22.12.2014
comment
но, похоже, он использует org.w3c.dom.Node - person lonesome; 22.12.2014
comment
Я не знаю, как это сделать. я имею в виду, что я не могу узнать, как использовать com.sun.org.apache.xerces.internal.dom.ParentNode, и поскольку в первой из моих программ я использовал org.w3c. dome.Node это как бы заставляет меня использовать кастинг, а затем, когда я запускаю программу, она запрещает разрешать кастинг и прочее. - person seventeen; 22.12.2014
comment
Я просто анализирую HTML-код страницы, а затем использую библиотеку tagsoup** для создания DOM из HTML. затем выберите некоторые узлы из этого DOM, которые хотят поместить их в список для будущего использования, но возникает эта проблема. - person seventeen; 22.12.2014
comment
это то, что я пытался объявить root в своей функции. я сделал это неправильно? - person seventeen; 22.12.2014
comment
Из вашего кода первый добавляемый узел будет корнем. Но как получить этот корень? Создавать его самостоятельно или получать откуда-то еще? Из другого вопроса вы должны использовать doc.createElement - person Michael Laffargue; 22.12.2014
comment
Я не совсем понял, что вы сейчас сказали. вы смотрели на функцию addnode в моем коде? - person seventeen; 22.12.2014
comment
как я объяснил, я делаю некоторые вычисления в дереве DOM страницы, выбираю несколько узлов, а затем добавляю их в список, вызывая эту функцию - person seventeen; 22.12.2014

ну, это смущает, но я изменил свою идею, чтобы реализовать это, и вместо этого использовалstatic List<Node> listOfNodes = new ArrayList<Node>(); , что хорошо сработало для меня!

person seventeen    schedule 23.12.2014