問題描述
我想對此文件進行 XPath 查詢(顯示摘錄):
I want to do an XPath query on this file (excerpt shown):
<?xml version="1.0" encoding="UTF-8"?>
<!-- MetaDataAPI generated on: Friday, May 25, 2007 3:26:31 PM CEST -->
<ModelClass xmlns="http://xml.sap.com/2002/10/metamodel/webdynpro" xmlns:IDX="urn:sap.com:WebDynpro.ModelClass:2.0">
<ModelClass.Parent>
<Core.Reference package="com.test.mypackage" name="ModelName" type="Model"/>
這是我正在使用的代碼片段:
This is a snippet of the code I'm using:
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document document = builder.parse(new File(testFile));
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext( new NamespaceContext() {
public String getNamespaceURI(String prefix) {
...
String result = xpath.evaluate(xpathQueryString, document);
System.out.println(result);
我面臨的問題是,當在 XPath 查詢中引用默認命名空間時,不會調用 getNamespaceURI 方法來解決它.例如,此查詢不會提取任何內容:
The problem I'm facing is that when the default namespace is referenced in an XPath query, the getNamespaceURI method is not called to resolve it. This query for example doesn't extract anything:
//xmlns:ModelClass.Parent/xmlns:Core.Reference[@type="Model"]/@package
現在我嘗試通過將 xmlns
替換為假前綴 d
來欺騙"解析器,然后相應地編寫 getNamespaceURI
方法(所以在遇到 d
時返回 http://xml.sap.com/2002/10/metamodel/webdynpro
).在這種情況下,會調用 getNamespaceURI
,但 XPath 表達式求值的結果始終是空字符串.
Now I've tried "tricking" the parser by replacing xmlns
with a fake prefix d
and then writing the getNamespaceURI
method accordingly (so to return http://xml.sap.com/2002/10/metamodel/webdynpro
when d
is encountered). In this case, the getNamespaceURI
is called but the result of the XPath expression evaluation is always an empty string.
如果我從文件和 XPath 查詢表達式中去除命名空間,我可以得到我想要的字符串 (com.test.mypackage).
If I strip out namespaces from the file and from the XPath query expression, I can get the string I wanted (com.test.mypackage).
有沒有辦法讓默認命名空間正常工作?
Is there a way to make things work properly with the default namespace?
推薦答案
在您的 Namespace
上下文中,將您選擇的前綴(例如 df
)綁定到命名空間 URI在文檔中
In your Namespace
context, bind a prefix of your choice (e.g. df
) to the namespace URI in the document
xpath.setNamespaceContext( new NamespaceContext() {
public String getNamespaceURI(String prefix) {
switch (prefix) {
case "df": return "http://xml.sap.com/2002/10/metamodel/webdynpro";
...
}
});
然后在路徑表達式中使用該前綴來限定元素名稱,例如/df:ModelClass/df:ModelClass.Parent/df:Core.Reference[@type = 'Model']/@package
.
and then use that prefix in your path expressions to qualify element names e.g. /df:ModelClass/df:ModelClass.Parent/df:Core.Reference[@type = 'Model']/@package
.
這篇關于Java XPath:使用默認命名空間 xmlns 進行查詢的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!