javaxpathxml-namespacesxom

Applying xpath on xml with default namespace with XOM


I have below XML which contains a default namespace

<?xml version="1.0"?>
<catalog xmlns="http://www.edankert.com/examples/">
  <cd>
    <artist>Stoat</artist>
    <title>Future come and get me</title>
  </cd>
  <cd>
    <artist>Sufjan Stevens</artist>
    <title>Illinois</title>
  </cd>
  <cd>
    <artist>The White Stripes</artist>
    <title>Get behind me satan</title>
  </cd>
</catalog>

And Im running following code expecting some result in return

Element rootElem = new Builder().build(xml).getRootElement();
xc = XPathContext.makeNamespaceContext(rootElem);
xc.addNamespace("", "http://www.edankert.com/examples/");   
Nodes matchedNodes = rootElem.query("cd/artist", xc);
System.out.println(matchedNodes.size());

But the size is always 0.

I gone through

Looking forward for any help.


Solution

  • Unprefixed names in XPath always mean "no namespace" - they don't respect the default namespace declaration. You need to use a prefix

    Element rootElem = new Builder().build(xml).getRootElement();
    xc = XPathContext.makeNamespaceContext(rootElem);
    xc.addNamespace("ex", "http://www.edankert.com/examples/");   
    Nodes matchedNodes = rootElem.query("ex:cd/ex:artist", xc);
    System.out.println(matchedNodes.size());
    

    It doesn't matter that the XPath expression uses a prefix where the original document didn't, as long as the namespace URI that is bound to the prefix in the XPath namespace context is the same as the URI that is bound by xmlns in the document.