I’m using XPath to pull out just the values of URL128 XML element. There can be many of these even though I just have one in the below example. When I include xmlns=’http://c1.net.corbis.com/’ on the SearchResponse element I get an empty NodeList, but when I remove that namespace element it works fine. Is there a configuration I’m missing?
String xmlData = "<SearchResponse xmlns='http://c1.net.corbis.com/'><searchResultDataXML><SearchResultData><SearchRequestUID Scope='Public' Type='Guid' Value='{cded773c-c4b7-4dd8-aaee-8e5b8b7a2475}'/><StartPosition Scope='Public' Type='Long' Value='1'/><EndPosition Scope='Public' Type='Long' Value='50'/><TotalHits Scope='Public' Type='Long' Value='323636'/></SearchResultData></searchResultDataXML><imagesXML><Images><Image><ImageUID Scope='Public' Type='Guid' Value='{a6f6d3e2-2c3f-4502-9741-eae2e1bb573a}'/><CorbisID Scope='Public' Type='String' Value='42-25763849'/><Title Scope='Public' Type='String' Value='Animals figurines'/><CreditLine Scope='Public' Type='String' Value='© Ocean/Corbis'/><IsRoyaltyFree Scope='Public' Type='Boolean' Value='True'/><AspectRatio Scope='Public' Type='String' Value='0.666667'/><URL128 Scope='Public' Type='String' Value='http://cachens.corbis.com/CorbisImage/thumb/25/76/38/25763849/42-25763849.jpg'/></Image></Images></imagesXML></SearchResponse>";
InputSource source = new InputSource(new StringReader(xmlData));
XPath xPath = XPathFactory.newInstance().newXPath();
NodeList list = null;
try {
list = (NodeList) xPath.evaluate("//URL128/@Value", source, XPathConstants.NODESET);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
for (int i = 0; i < list.getLength(); i++) {
System.out.println(list.item(i).getTextContent());
}
Well, long story short you need to provide a
NamespaceContextto yourXPath:It seems the only method XPath requires us to implement in this case is
getNamespaceURI(String prefix).Note that the actual prefix in “c:URL128” doesn’t really matter in this case—you could just as easily use “:URL128”. When you do have multiple namespaces in your XML then it becomes important to distinguish among them (using a
Mapor a series ofif-then-elseif relatively few elements).If you can’t or don’t want to hard code the prefixes you can extract them yourself from the XML document but that requires a little more code…
See also this blog post for more details.