java DOM lookupNamespaceURI无法定位命名空间URI

java DOM lookupNamespaceURI无法定位命名空间URI,java,dom,namespaces,Java,Dom,Namespaces,我正试着跟着 解析针对XML的XPath计算的名称空间的示例。我遇到的问题是下面的lookupNamespaceURI调用在XML上返回null,我在下面给出: DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = domFactory.newDocumentBuilder(); Document dDoc = builder

我正试着跟着

解析针对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>

苹果
香蕉
`

配置DocumentBuilder时,我希望它返回“.”

,但您必须明确地让它知道名称空间(这是xml最初没有名称空间时的一个愚蠢的遗物):

作为旁注,那篇文章中的建议不是很好。它从根本上忽略了一点,即您不关心实际文档中的名称空间前缀是什么,它们是不相关的。您需要xpath名称空间解析器来匹配您正在使用的xpath表达式,仅此而已。如果您按照他们的建议去做,那么每当文档的前缀发生变化时,您就必须更改xpath代码,这是一个可怕的想法

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

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


配置DocumentBuilder时,必须显式地使其具有名称空间意识(这是xml最初没有名称空间时的愚蠢遗物):

作为旁注,那篇文章中的建议不是很好。它从根本上忽略了一点,即您不关心实际文档中的名称空间前缀是什么,它们是不相关的。您需要xpath名称空间解析器来匹配您正在使用的xpath表达式,仅此而已。如果您按照他们的建议去做,那么每当文档的前缀发生变化时,您就必须更改xpath代码,这是一个可怕的想法

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

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


谢谢杰塔伯恩!setNamespaceAware帮助了我们!我没有意识到这一点。至于另一件事——XPath和XML都可以是任何东西。我不知道那里将使用什么名称空间。而且,我知道当处理具有相同或不同名称空间的不同前缀时,UniversalNamespaceResolver建议会在某个时候失败。但我不知道如何正确处理它。@user431529-我不明白,你怎么能为xml文档编写xpath而不知道使用了什么名称空间呢,原因并不那么明显:我们有一个接收xpath和xml的服务,并期望将结果返回给遗留系统。@jtahlborn想象一个可以从xml文档进行邮件合并的工具。用户将该工具指向一个XML客户信息文档目录,并提供Xpath查询来查找每个文档中的“Name”和“Email”。该工具将对每个文档运行xpath查询,并向每个客户生成一封电子邮件。我希望用户能够在xpath中使用名称空间,但我不知道在编译工具代码时这些名称空间将是什么。我希望用户能够使用与文档在xpath查询中使用的名称空间前缀相同的名称空间前缀,这有意义吗?@Perrynfoller-我可以想象很多事情。是的,第三方根据xml文档的外观输入特殊xpath的程序对于这样的名称空间解析器来说无疑是一个合法的用例。但是,这是一个特定的用例,在大多数程序中,根据文档的外观设置xpath ns前缀表明对xml名称空间前缀的工作方式存在很大误解。谢谢jtahlborn!setNamespaceAware帮助了我们!我没有意识到这一点。至于另一件事——XPath和XML都可以是任何东西。我不知道那里将使用什么名称空间。而且,我知道当处理具有相同或不同名称空间的不同前缀时,UniversalNamespaceResolver建议会在某个时候失败。但我不知道如何正确处理它。@user431529-我不明白,你怎么能为xml文档编写xpath而不知道使用了什么名称空间呢,原因并不那么明显:我们有一个接收xpath和xml的服务,并期望将结果返回给遗留系统。@jtahlborn想象一个可以从xml文档进行邮件合并的工具。用户将该工具指向一个XML客户信息文档目录,并提供Xpath查询来查找每个文档中的“Name”和“Email”。该工具将对每个文档运行xpath查询,并向每个客户生成一封电子邮件。我希望用户能够在xpath中使用名称空间,但我不知道在编译工具代码时这些名称空间将是什么。我希望用户能够使用与文档在xpath查询中使用的名称空间前缀相同的名称空间前缀,这有意义吗?@Perrynfoller-我可以想象很多事情。是的,第三方根据xml文档的外观输入特殊xpath的程序对于这样的名称空间解析器来说无疑是一个合法的用例。但是,这是一个特定的用例,在大多数程序中,根据文档的外观设置xpath ns前缀表明对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>
domFactory.setNamespaceAware(true);