38 Stimmen

Ermitteln des untergeordneten Knotens eines anderen Knotens, gegebener Knotenname

Ich habe eine XML-Datei wie diese:

<documentslist>
  <document>
    <docnumber>1</docnumber>
    <docname>Declaration of Human Rights</docname>
    <aoo>lib</aoo>
  </document>
  <document>
    <docnumber>2</docnumber>
    <docname>Fair trade</docname>
    <aoo>lib</aoo>
  </document>
  <document>
    <docnumber>3</docnumber>
    <docname>The wars for water</docname>
    <aoo>lib</aoo>
  </document>
  <!-- etc. -->
</documentslist>

Ich habe diesen Code:

//XML parsing
Document docsDoc = null;
try {
    DocumentBuilder db = dbf.newDocumentBuilder();
    docsDoc = db.parse(new InputSource(new StringReader(xmlWithDocs)));
}
catch(ParserConfigurationException e) {e.printStackTrace();}
catch(SAXException e) {e.printStackTrace();}
catch(IOException e) {e.printStackTrace();}
//retrieve document elements
NodeList docs = docsDoc.getElementsByTagName("document");

if (docs.getLength() > 0){
    //print a row for each document
    for (int i=0; i<docs.getLength(); i++){
        //get current document
        Node doc = docs.item(i);
        //print a cell for some document children
        for (int j=0; j<columns.length; j++){
            Node cell;
            //print docname
            cell = doc.getElementsByTagName("docname").item(0); //doesn't work
            System.out.print(cell.getTextContent() + "\t");
            //print aoo
            cell = doc.getElementsByTagName("aoo").item(0); //doesn't work
            System.out.print(cell.getTextContent() + "\t");
        }
        System.out.println();
    }
}

Aber, wie Sie wissen Node hat nicht getElementsByTagName Methode ... Nur Document hat es. Aber ich kann es nicht tun docsDoc.getElementsByTagName("aoo") denn sie wird mir alles zurückgeben <aoo> Knoten, nicht nur die in der <document> Knotenpunkt, den ich inspiziere.

Wie könnte ich das tun? Danke!

53voto

jarnbjo Punkte 33136

Wenn die Node ist nicht nur ein beliebiger Knoten, sondern tatsächlich ein Element (es könnte auch z.B. ein Attribut oder ein Textknoten sein), können Sie ihn in Element und verwenden getElementsByTagName .

27voto

Yeameen Punkte 813

Prüfen Sie, ob die Node ist ein Dom Element , Besetzung und Anruf getElementsByTagName()

Node doc = docs.item(i);
if(doc instanceof Element) {
    Element docElement = (Element)doc;
    ...
    cell = doc.getElementsByTagName("aoo").item(0);
}

6voto

Marcos Vasconcelos Punkte 18038

Sie sollten es rekursiv lesen, vor einiger Zeit hatte ich die gleiche Frage und löste sie mit diesem Code:

public void proccessMenuNodeList(NodeList nl, JMenuBar menubar) {
    for (int i = 0; i < nl.getLength(); i++) {
        proccessMenuNode(nl.item(i), menubar);
    }
}

public void proccessMenuNode(Node n, Container parent) {
    if(!n.getNodeName().equals("menu"))
        return;
    Element element = (Element) n;
    String type = element.getAttribute("type");
    String name = element.getAttribute("name");
    if (type.equals("menu")) {
        NodeList nl = element.getChildNodes();
        JMenu menu = new JMenu(name);

        for (int i = 0; i < nl.getLength(); i++)
            proccessMenuNode(nl.item(i), menu);

        parent.add(menu);
    } else if (type.equals("item")) {
        JMenuItem item = new JMenuItem(name);
        parent.add(item);
    }
}

Wahrscheinlich können Sie es für Ihren Fall anpassen.

0voto

Suman Das Punkte 17
//xn=list of parent nodes......                
foreach (XmlNode xn in xnList)
{                                           
    foreach (XmlNode child in xn.ChildNodes) 
    {
        if (child.Name.Equals("name")) 
        {
            name = child.InnerText; 
        }
        if (child.Name.Equals("age"))
        {
            age = child.InnerText; 
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X