2014-12-22 5 views
5

Ich beschloss, die Zusammenfassung List<Node> zu implementieren. hier ist ein Stück davon:Implementieren der Liste <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); 
    }  
    } 

aber wenn ich zu add einen Knoten versuchen, es gibt mir die folgende Ausnahme:

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) 

ist dies wegen der Node root = null; die einen Knoten hinzuzufügen, macht zu ein Nullknoten? dann wie behoben werden kann

Antwort

0

gut das ist peinlich, aber ich änderte meine Idee zu implementieren, und stattdessen static List<Node> listOfNodes = new ArrayList<Node>(); , die gut für mich gearbeitet hat!

1

Sie können nicht an eine com.sun.org.apache.xerces.internal.dom.NodeImpl anhängen, müssen Sie com.sun.org.apache.xerces.internal.dom.ParentNode verwenden.

appendChild werden insertBefore nennen, die nur ein Exception für NodeImpl

Source code

Verschieben eines oder mehrere Knoten (n) zu unserer Liste der Kinder werfen. Beachten Sie, dass diese sie implizit von ihren vorherigen Eltern löscht.

Standardmäßig akzeptieren wir keine untergeordneten Elemente, ParentNode überschreibt diese.

Werfen Sie einen Blick, wie Axis ihre umgesetzt: http://grepcode.com/file/repo1.maven.org/maven2/com.ning/metrics.collector/1.0.2/org/apache/axis/message/NodeListImpl.java

Es scheint, Sie versuchen, einen Knotenbaum mit dem ersten Knoten als Root, nicht eine Knotenliste zu bauen. Was nicht möglich ist, sind Ihre Knoten NodeImpl nicht ParentNode.

Wenn Sie einen Baum möchten, müssen Sie irgendwie einen Elternknoten erstellen (oder importieren). Wenn Sie nur eine Liste benötigen, verwenden Sie eine List.


Möglicherweise müssen Sie ein gefälschtes benutzerdefiniertes übergeordnetes Element erstellen, um Ihre Knoten einzufügen. HIERARCHY_REQUEST_ERR while trying to add elements to xml file in a for loopHIERARCHY_REQUEST_ERR while trying to add elements to xml file in a for loop

+0

aber es scheint, dass er verwendet ** org.w3c.dom.Node ** – lonesome

+0

Ich weiß nicht, wie das geht. Was ich meine, ist, dass ich nicht herausfinden kann, wie man ** com.sun.org.apache.xerces.internal.dom.ParentNode ** benutzt und da ich in den ersten meiner Programme ** org.w3c.dome.Node * verwendet habe * Es bringt mich dazu Casting zu benutzen und dann, wenn ich das Programm starte, leugnet es Casting und so. – seventeen

+0

Ich analysiere nur den HTML-Code einer Seite, dann benutze die "" tagsoup ** -Bibliothek, um das DOM aus dem HTML zu erstellen. Wählen Sie dann einige Knoten aus diesem DOM aus, die Sie zur späteren Verwendung in eine Liste einfügen möchten. Dieses Problem tritt jedoch auf. – seventeen