Java XPath : Queries with default namespace xmlns

标签 java xml xpath namespaces xml-namespaces

我想对此文件执行 XPath 查询(显示摘录):

<?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"/>

这是我正在使用的代码片段:

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 查询中引用默认 namespace 时,不会调用 getNamespaceURI 方法来解决它。 例如,此查询不提取任何内容:

//xmlns:ModelClass.Parent/xmlns:Core.Reference[@type=\"Model\"]/@package

现在我尝试通过用假前缀 d 替换 xmlns 来“欺骗”解析器,然后相应地编写 getNamespaceURI 方法(所以当遇到 d 时返回 http://xml.sap.com/2002/10/metamodel/webdynpro)。在这种情况下,将调用 getNamespaceURI,但 XPath 表达式求值的结果始终为空字符串。

如果我从文件和 XPath 查询表达式中去除 namespace ,我可以获得我想要的字符串 (com.test.mypackage)。

有没有办法让默认命名空间正常工作?

最佳答案

XPath 1.0 规范要求“没有前缀意味着没有 namespace ”。因此,为 XPath 1.0 设计的 JAXP 非常正确地阻止您将“空前缀”绑定(bind)到某些非空 namespace 。

XPath 2.0 允许您在 XPath 表达式中为非限定名称声明一个默认 namespace ,但要利用它,您需要一个利用此功能的 API(例如 Saxon 的 s9api)。

关于Java XPath : Queries with default namespace xmlns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10720452/

相关文章:

java - 如何使用C中的crypt库进行DES加密? (设置 key 、加密、加密等)

java - 将列表与自身交错

xml - ClassNotFoundException : org. apache.xml.serializer.TreeWalker

android - ListView 项目未正确对齐

xml - 属性组的选择

java - 如何在 Java 中连接到 Cloud Foundry MySQL 数据库连接?

Java:分割函数的默认值

java - 具有 namespace 的文档的 Java XPath 解析器的奇怪行为

javascript - 如何在具有多个具有相同 id 的元素的文档中获取元素的 XPATH?

基于元素文本的 Selenium xpath 选择器