0

我正在尝试关注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/ ”。

4

1 回答 1

3

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

domFactory.setNamespaceAware(true);

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

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

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

于 2013-03-22T14:02:51.517 回答