Search code examples
javaxmldomxpathsax

How to retrieve values of attributes in nodelist


for the below xml file, i want to retrieve the values of the ids the corresponds to the the lat = 53.0337395 and in the xml there are two ids with lat = 53.0337395. as shown below, to achieve this i wrote the below code but at run time i receive #NUMBER cannt be converted into a nodelist

please let me know how to solve it

String expr0 = "count(//node[@lat=53.0337395]//@id)";
xPath.compile(expr0);
NodeList nodeList = (NodeList) xPath.compile(expr0).evaluate(document, 
XPathConstants.NODESET);
System.out.println(nodeList.getLength());

xml:

<?xml version='1.0' encoding='utf-8' ?>
<osm>
<node id="25779111" lat="53.0334062" lon="8.8461545"/>
<node id="25779112" lat="53.0338904" lon="8.846314"/>
<node id="25779119" lat="53.0337395" lon="8.8489255"/>
<tag k="maxspeed" v="30"/>  
<tag k="maxspeed:zone" v="yes"/>
<node id="25779111" lat="53x.0334062" lon="8x.8461545"/>
<node id="25779112" lat="53x.0338904" lon="8x.846314"/>
<node id="257791191" lat="53.0337395" lon="8x.8489255"/>
<tag k="maxspeed" v="30x"/> 
<tag k="maxspeed:zone" v="yes"/>
</osm>

Solution

  • I'm not sure why you are using a count() if you want to get a list of nodes (count() is going to return a number, not a list). Try this instead:

    String expr0 = "/osm/node[@lat=53.0337395]/@id";
    NodeList nodeList = (NodeList) xPath.compile(expr0).evaluate(document,
                                                                 XPathConstants.NODESET);
    System.out.println(nodeList.getLength());
    

    Here is a complete compilable example using your XML file as input:

    import java.io.File;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.xpath.XPath;
    import javax.xml.xpath.XPathConstants;
    import javax.xml.xpath.XPathFactory;
    import org.w3c.dom.Document;
    import org.w3c.dom.NodeList;
    
    public class IdFinder
    {
        public static void main(String[] args)
                throws Exception
        {
            File fXmlFile = new File("C:/Users/user2121/osm.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document document = dBuilder.parse(fXmlFile);
    
            XPath xPath = XPathFactory.newInstance().newXPath();
    
            String expr0 = "/osm/node[@lat=53.0337395]/@id";
            NodeList nodeList = (NodeList) xPath.compile(expr0).evaluate(document, XPathConstants.NODESET);
    
            System.out.println("Matches: " + nodeList.getLength());
            for (int i = 0; i < nodeList.getLength(); i++) {
                System.out.println(nodeList.item(i).getNodeValue());
            }
        }
    }
    

    The output of this is:

    Matches: 2
    25779119
    257791191