2009-06-23 5 views
7

Ich möchte überprüfen, ob ein XML-Dokument ein Element 'Person' irgendwo im Inneren enthält. Ich kann sehr einfach alle erste Generation Elemente überprüfen:Iterieren Sie alle XML-Knoten-Generationen in Java DOM

NodeList nodeList = root.getChildNodes(); 
for(int i=0; i<nodeList.getLength(); i++){ 
    Node childNode = nodeList.item(i); 
    if (childNode.getNodeName() == "person") { 
    //do something with it 
    } 
} 

Und, und ich kann mehr Schleifen fügt in Subelemente zu gehen, aber ich würde wissen, wie viele verschachtelte Schleifen in setzen, um zu bestimmen, wie weit in die Dokument zu bohren. Ich könnte 10 Schleifen verschachteln und am Ende ein Element mit 12 Elementen in einem Dokument verschachteln. Ich muss in der Lage sein, das Element herauszuziehen, egal wie tief es verschachtelt ist.

Gibt es eine Möglichkeit, Elemente aus einem ganzen Dokument zu ernten? Wie geben Sie die Textwerte aller Tags als Array zurück oder iterieren Sie darüber?

So etwas wie Python elementtree 'findall' Methode vielleicht:

for person in tree.findall('//person'): 
    personlist.append(person) 
+1

Ich glaube, Sie brauchen http://en.wikipedia.org/wiki/Recursion_%28computer_science % 29. –

Antwort

10

Wie mmyers heißt, Sie Rekursion für dieses Problem verwenden könnte.

doSomethingWithAll(root.getChildNodes()); 

void doSomethingWithAll(NodeList nodeList) 
{ 
    for (int i = 0; i < nodeList.getLength(); i++) { 
     Node childNode = nodeList.item(i); 
     if (childNode.getNodeName().equals("person")) { 
      //do something with it 
     } 

     NodeList children = childNode.getChildNodes(); 
     if (children != null) 
     { 
      doSomethingWithAll(children); 
     } 
    } 
} 
10

ich drei Möglichkeiten (zwei davon sehen andere haben geantwortet):

  1. Rekursion verwenden.
  2. Verwenden Sie XPath (möglicherweise ein wenig übertrieben für dieses Problem, aber wenn Sie eine viele Abfragen wie diese haben, ist es definitiv etwas zu erkunden). Verwenden Sie die Hilfe von kdgregory; a schnellen Blick auf die API zeigte, dass es ist ein bisschen schmerzhaft, direkt zu verwenden.
  3. Wenn, was Sie haben, ist in der Tat ein Document (das heißt, wenn root ist ein Document) Sie Document.getElementsByTagName
+1

+1 - # 3 ist definitiv der einfachste Ansatz – kdgregory

+0

+1 für den 3. Ansatz – NemoStein

0

Neben Document.getElementsByTagName() oder XPath verwenden können, können Sie auch jOOX nutzen könnten, eine Bibliothek die ich für einfacheren XML-Zugriff und -Manipulation erstellt habe. jOOX umschließt Standard-Java-APIs und fügt jquery ähnliche Hilfsmethoden hinzu. Ihr Python-Code-Snippet würde dann übersetzen zu diesem Java-Code:

// Just looking for tag names 
for (Element person : $(tree).find("person")) { 
    personlist.append(person); 
} 

// Use XPath for more elaborate queries 
for (Element person : $(tree).xpath("//person")) { 
    personlist.append(person); 
} 
2

Hier ist die formatierte Version:

Element root = xmlData.getDocumentElement(); 
NodeList children = root.getChildNodes(); 

public void doSomethingWithAllToConsole(NodeList nodeList, String tabs) 
{ 
    for(int i=0; i<nodeList.getLength(); i++){ 

     //print current node & values 
     Node childNode = nodeList.item(i); 
     if(childNode.getNodeType()==Node.ELEMENT_NODE){ 
      System.out.print(tabs + childNode.getNodeName()); 
      if(childNode.getFirstChild()!=null 
        && childNode.getFirstChild().getNodeType()==Node.TEXT_NODE 
        && !StringUtil.isNullOrEmpty(childNode.getFirstChild().getNodeValue())){ 
       System.out.print(" = " + childNode.getFirstChild().getNodeValue()); 
      } 
      System.out.println(); 
     } 

     //recursively iterate through child nodes 
     NodeList children = childNode.getChildNodes(); 
     if (children != null) 
     { 
      doSomethingWithAllToConsole(children, tabs+"\t"); 
     } 
    } 
}