Tengo este XML:

<root>
  <items>
    <item1>
      <tag1>1</tag1>            
      <sub>
        <sub1>10 </sub1>
        <sub2>20 </sub2>
      </sub>
    </item1>

    <item2>
      <tag1>1</tag1>            
      <sub>
        <sub1> </sub1>
        <sub2> </sub2>
      </sub>        
    </item2>
  </items>
</root>

Quiero conseguir el item1 elemento y el nombre y los valores de los elementos secundarios.

Que es, quiero llegar: tag1 – 1,sub1-10,sub2-20.

¿Cómo puedo hacer esto? hasta el momento sólo puedo obtener elementos sin los niños.

  • ¿Qué has intentado hasta ahora? Por favor, incluya el XPath y código Java que uso en su pregunta.
InformationsquelleAutor Michael A | 2012-08-01

2 Comentarios

  1. 3
    import org.w3c.dom.*;
    import javax.xml.parsers.*;
    import javax.xml.xpath.*;
    /**
    * File: Ex1.java @author ronda
    */
    public class Ex1 {
    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory Factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = Factory.newDocumentBuilder();
        Document doc = builder.parse("myxml.xml");
    
        //creating an XPathFactory:
        XPathFactory factory = XPathFactory.newInstance();
        //using this factory to create an XPath object: 
        XPath xpath = factory.newXPath();
    
        //XPath Query for showing all nodes value
        XPathExpression expr = xpath.compile("//" + "item1" + "/*");
        Object result = expr.evaluate(doc, XPathConstants.NODESET);
        NodeList nodes = (NodeList) result;
        System.out.println(nodes.getLength());
        for (int i = 0; i < nodes.getLength(); i++) {
    
            Element el = (Element) nodes.item(i);
    
            System.out.println("tag: " + el.getNodeName());
            //seach for the Text children
            if (el.getFirstChild().getNodeType() == Node.TEXT_NODE)
                System.out.println("inner value:" + el.getFirstChild().getNodeValue());
    
            NodeList children = el.getChildNodes();
            for (int k = 0; k < children.getLength(); k++) {
                Node child = children.item(k);
                if (child.getNodeType() != Node.TEXT_NODE) {
                    System.out.println("child tag: " + child.getNodeName());
                    if (child.getFirstChild().getNodeType() == Node.TEXT_NODE)
                        System.out.println("inner child value:" + child.getFirstChild().getNodeValue());;
                }
            }
        }
    }
    }

    Puedo obtener esta salida de cargar el xml de tu pregunta en el archivo llamado: myxml.xml:

    run:
    2
    tag: tag1
    inner value:1
    tag: sub
    inner value:
    
    child tag: sub1
    inner child value:10 
    child tag: sub2
    inner child value:20

    …un poco prolijo, pero nos permite entender cómo funciona. PS: he encontrado una buena guía en aquí

  2. 4
    Document doc = ...;
    XPath xpath = XPathFactory.newInstance().newXPath();
    XPathExpression expr = xpath.compile("/root/items/item1/*/text()");
    Object o = expr.evaluate(doc, XPathConstants.NODESET);
    NodeList list = (NodeList) o;

Dejar respuesta

Please enter your comment!
Please enter your name here