Document announces separate blank namespace rendering NamespaceAware results are useless

I am trying to do some searches on the "correct" pom.xml used by maven. For this, I use basic XPath queries from the JDOM.

Unfortunately, queries do not return any results (and do not have simple descendant filters). I am sure the problem is with the root pom.xml declaration:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<!-- content -->
</project>

As you can see, an empty namespace is defined that does not match either "", or "http://www.w3.org/2000/xmlns/"where "" is the default namespace and the xmlns namespace is the default xmlns namespace.

So given a Documentwhen I want to run XPath-Query, as shown below:

XPathBuilder<Element> depQueryBuilder = new XPathBuilder<>("//dependencies/dependency", Filters.element());
XPathExpression<Element> depQuery = depQueryBuilder.compileWith(XPathFactory.instance());

for  (Element elem : depQuery.evaluate(document)) {
    // basically unreachable, since the resultset is always empty
}

, XPath ( XPathHelper javadoc), , , .

:

depQueryBuilder.setNamespace("", document.getRootElement().getAttributeValue("xmlns"));
// NPE: Null URI
depQueryBuilder.setNamespace("", "http://maven.apache.org/POM/4.0.0");
// Cannot set a Namespace URI in XPath for "" prefix
depQueryBuilder.setNamespace(Namespace.NO_NAMESPACE);
// no error-message, but no results either
depQueryBuilder.setNamespace(document.getRootElement().getNamespace("xmlns"));
// NPE: Null Namespace
depQueryBuilder.setNamespace(document.getRootElement().getNamespace(""));
// Cannot set a Namespace URI in XPath for "" prefix
depQueryBuilder.setNamespace("xmlns", "http://maven.apache.org/POM/4.0.0");
// Name "xmlns" is not legal for JDOM/XML Namespace prefix

, . XPath ?

. :

document.getRootElement().getDescendants(Filter.element("dependency"));
// empty iterator
document.getRootElement().getChild("dependencies").getChildren("dependency"));
// NullPointerException because there is no child "dependencies"
+6
1

XPath XML .

XPaths, , , XML-, "". XML " " ( , , , xmlns="....").

XPath, (. - ):

QName node , . , , , xmlns, : QName , URI null

, XML , dependencies, XPath. - XML. , , "ns", :

XPathBuilder<Element> depQueryBuilder = new XPathBuilder<>("//ns:dependencies/ns:dependency", Filters.element());
depQueryBuilder.setnamespace("ns", "http://maven.apache.org/POM/4.0.0");
XPathExpression<Element> depQuery = depQueryBuilder.compileWith(XPathFactory.instance());

:

Namespace ns = Namespace.getNamespace("ns", "http://maven.apache.org/POM/4.0.0");
XPathExpression<Element> depQuery = XPathFactory.instance()
  .compile("//ns:dependencies/ns:dependency", Filters.element(), null, ns);
+4

All Articles