1

I have this 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>

I want to get the item1 element and the name and values of the child elements.

That is, i want to get: tag1 - 1,sub1-10,sub2-20.

How can i do this? so far i can only get elements without children.

1
  • What have you tried so far? Please include the XPath and Java code you use in your question. Commented Aug 1, 2012 at 8:49

2 Answers 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;
Sign up to request clarification or add additional context in comments.

Comments

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

I get this output loading the xml of your question in file named: 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

...a bit wordy, but allow us to understand how it works. PS: I found a good guide in here

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.