我試圖對maven使用的「正確」pom.xml執行一些檢索查詢。爲此,我使用JDOM的基本XPath查詢。文檔聲明單獨的空名稱空間渲染NamespaceAware結果無用
不幸的是,查詢不會返回任何結果(也不會執行簡單的後代過濾器)。我有理由相信,問題的關鍵在於pom.xml中的根聲明中:
<?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>
可以看到一個空的命名空間定義不匹配或者""
或"http://www.w3.org/2000/xmlns/"
,其中「」是默認的No-Namespace和xmlns命名空間是默認的xmlns命名空間。
所以給予Document
,當我想執行一個XPath查詢類似如下:
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查詢返回結果?
注:以下更簡單的查詢不返回結果之一:在XML
document.getRootElement().getDescendants(Filter.element("dependency"));
// empty iterator
document.getRootElement().getChild("dependencies").getChildren("dependency"));
// NullPointerException because there is no child "dependencies"