【问题标题】:java DOM lookupNamespaceURI is not able to locate namespace URIjava DOM lookupNamespaceURI 无法找到命名空间 URI
【发布时间】:2013-03-22 13:52:21
【问题描述】:

我正在尝试关注http://www.ibm.com/developerworks/xml/library/x-nmspccontext/index.html

    UniversalNamespaceResolver

针对 XML 解析 XPath 评估的命名空间的示例。我遇到的问题是下面的lookupNamespaceURI调用在XML上返回null,我在下面给出:

    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();

    DocumentBuilder builder = domFactory.newDocumentBuilder();
    Document dDoc = builder.parse(new InputSource(new StringReader(xml)));

    String nsURI = dDoc.lookupNamespaceURI("h");

XML:

<?xml version="1.0"?>

<h:root xmlns:h="http://www.w3.org/TR/html4/">

   <h:table>
     <h:tr>
       <h:td>Apples</h:td>
       <h:td>Bananas</h:td>
     </h:tr>
   </h:table>`
</h:root>

虽然我希望它返回“http://www.w3.org/TR/html4/”。

【问题讨论】:

    标签: java dom namespaces


    【解决方案1】:

    在配置 DocumentBuilder 时,您必须明确地让它知道命名空间(当没有命名空间时 xml 的第一天,这是一个愚蠢的遗物):

    domFactory.setNamespaceAware(true);
    

    附带说明,那篇文章中的建议不是很好。它从根本上忽略了您不关心实际文档中的命名空间前缀是什么,它们无关紧要。您需要 xpath 命名空间解析器来匹配您正在使用的 xpath 表达式,仅此而已。如果您按照他们的建议进行操作,那么每当文档的前缀更改时,您都必须更改 xpath 代码,这是一个可怕的想法。

    请注意,他们在最后一个项目符号中放弃了这一点,但文章的其余部分似乎忽略了这是使用 xpath 时的基本思想。

    但是,如果您无法控制 XML 文件,并且有人可以向您发送他们希望的任何前缀,那么最好独立于他们的选择。您可以按照示例 1 (HardcodedNamespaceResolver) 编写自己的命名空间解析,并在 XPath 表达式中使用它们。

    【讨论】:

    • 感谢 jtahlborn! setNamespaceAware 有帮助!我没有意识到这一点。至于另一件事——XPath 和 XML 都可以。我不知道将在那里使用哪些命名空间。而且,我知道在处理具有相同或不同名称空间的不同前缀时,UniversalNamespaceResolver 建议会在某些时候失败。但我不知道如何正确处理。
    • @user431529 - 我不明白,你怎么能为 xml 文档编写 xpath 而知道正在使用哪些命名空间?
    • 嗯,原因并不那么明显:我们有一个服务,它接收 xpath 和 xml,并期望将结果返回到旧系统。
    • @jtahlborn 想象一个可以从 XML 文档合并邮件的工具。用户将工具指向 XML 客户信息文档的目录,并提供 Xpath 查询以在每个文件中查找“姓名”和“电子邮件”。该工具将对每个文档运行 xpath 查询,并为每个客户生成一封电子邮件。我希望用户能够在他们的 xpath 中使用命名空间,但我不知道当我编译工具代码时这些命名空间将是什么。我希望用户能够使用相同的命名空间前缀文档在他们的 xpath 查询中使用,这有意义吗?
    • @PerrynFowler - 我可以想象很多事情。是的,第 3 方根据 xml 文档的外观进入 ad hoc xpath 的程序当然是这样的名称空间解析器的一个合法用例。然而,这是一个特定的用例,在大多数程序中,根据文档的外观设置 xpath ns 前缀表明对 xml 命名空间前缀的工作方式存在误解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2013-02-25
    • 2011-07-19
    • 1970-01-01
    • 2017-07-09
    相关资源
    最近更新 更多