当前位置: 首页 > 知识库问答 >
问题:

Java XPath:使用默认名称空间xmlns的查询

汲涵育
2023-03-14

我想对这个文件进行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查询中引用默认名称空间时,不会调用getNamespaceURI方法来解决它。例如,此查询不提取任何内容:

//xmlns:ModelClass。父/xmlns:Core。参考[@type=\'Model\']/@package

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

如果我从文件和XPath查询表达式中去掉名称空间,就可以得到我想要的字符串(com.test.mypackage)。

是否有一种方法可以使默认命名空间正常工作?

共有2个答案

邹山
2023-03-14

名称空间上下文中,将您选择的前缀(例如df)绑定到文档中的名称空间URI

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。父/df:核心。参考[@type='Model']/@package

寇靖
2023-03-14

XPath 1.0规范要求“没有前缀意味着没有命名空间”。因此,为XPath 1.0设计的JAXP阻止您将“空前缀”绑定到一些非空命名空间是非常正确的。

XPath 2.0允许您在XPath表达式中为不合格的名称声明默认命名空间,但是要利用这一点,您需要一个利用这一特性的应用编程接口(如Saxon的s9api)。

 类似资料:
  • 问题内容: 我要对此文件执行XPath查询(显示的摘录): 这是我正在使用的代码的摘要: 我面临的问题是,在XPath查询中引用默认名称空间时,不会调用getNamespaceURI方法来解决它。例如,此查询不提取任何内容: 现在,我尝试通过用假前缀替换来“诱骗”解析器,然后相应地编写方法(以便在遇到问题时返回)。在这种情况下,将调用,但是XPath表达式求值的结果始终是一个空字符串。 如果我从文

  • 问题内容: 有没有一种方法可以在python ElementTree中定义默认/无前缀的命名空间?这似乎不起作用… 这也不是: 可以,但是我必须在每个元素前加上前缀: 在OSX上使用Python 3.5。 编辑:如果答案为“否”,您仍然可以获得赏金:-)。我只是想要一个花了很多时间使用它的人的明确“否”。 问题答案: 没有简单的方法可以透明地处理默认名称空间。正如您已经提到的,为空名称空间分配非空

  • 我的数据有一个ATOM-XML表示,通过Spring MVC web服务返回。我使用JAXB进行序列化,我有许多名称空间,但我希望默认名称空间设置为Atom,不带前缀。下面是我到目前为止在中的内容,但是atom前缀被设置为NS3。 另外,我注意到chrome中显示的名称空间,而Firefox中没有。

  • 问题内容: 我想使用JDOM读取XML文件,然后使用XPath从JDOM Document中提取数据。它可以很好地创建Document对象,但是当我使用XPath在Document中查询元素列表时,我什么也没得到。 我的XML文档在根元素中定义了一个默认名称空间。有趣的是,当我删除默认名称空间时,它成功运行了XPath查询并返回了我想要的元素。要使XPath查询返回结果,我还必须做什么? XML:

  • 我需要使用默认命名空间创建/读取xml文件: 但我得到: 我知道包级元数据,但这在复杂的包结构中不起作用: 我已经定义了模型类,如Address: 客户: 公共字段的父类: 然后是保存具体xml XmlBoo的数据/结构的特定类: XmlFoo: package-info.java包括在两个提到的包example.xml.boo: 和example.xml.foo: 最后是主要方法: 我在这里尝试