2011-04-06 42 views
22

tengo un XML como esto:Obtener nodo hijo de otro nodo, teniendo en cuenta el nombre del nodo

<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> 

tengo este código:

//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(); 
    } 
} 

Pero, como saben Node no tiene getElementsByTagName método ... Sólo Document lo tiene. Pero no puedo hacer docsDoc.getElementsByTagName("aoo"), porque me devolverá todos los nodos <aoo>, no solo el existente en el nodo <document> que estoy inspeccionando.

¿Cómo podría hacerlo? ¡Gracias!

+0

Google o Wikipedia: recursividad. –

Respuesta

33

Si el Node no es cualquier nodo, pero en realidad un Element (que también podría ser por ejemplo, un atributo o un nodo de texto), puede echarlo a Element y utilizar getElementsByTagName.

+1

Esto no es del todo cierto. El elemento realmente se extiende Nodo y no al revés. No me basaría en que el Nodo siempre sea un Elemento, asegúrate de lanzar después de verificar el tipo de Nodo usando instanceof como lo sugirió Yeameen. Referencia: http://docs.oracle.com/javase/6/docs/api/org/w3c/dom/Element.html – siyb

+0

@siyb No leyó esta respuesta correctamente. – JLRishe

6

es preferible hacerlo de forma recursiva, hace algún tiempo que tenía la misma pregunta y resolver con este código:

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); 
    } 
} 

Probablemente se puede adaptar para su caso.

19

Comprobar si el Node es un Dom Element, fundido, y llamar getElementsByTagName()

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

if (node.getNodeType() == Node.ELEMENT_NODE) ​​ – djangofan

2
//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; 
     } 
    } 
} 
+2

Comente sobre el resaltado de su código que ayudará a resolver el problema. Eso ayudará a que sea más fácil de entender. – RinoTom

Cuestiones relacionadas