java DOM lookupNamespaceURI无法找到名称空间URI

时间:2013-03-22 13:52:22

标签: java dom namespaces

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

1 个答案:

答案 0 :(得分:2)

配置DocumentBuilder时,必须明确地使其符合名称空间(当没有名称空间时,从xml的前几天开始是一个愚蠢的遗物):

domFactory.setNamespaceAware(true);

作为旁注,该文章中的建议并不是很好。它从根本上忽略了你不关心实际文档中名称空间前缀的含义,它们是无关紧要的。你需要xpath命名空间解析器来匹配你正在使用的xpath表达式,这就是全部。如果你按照他们的建议行事,那么每当文档的前缀发生变化时,你就必须更改你的xpath代码,这是一个可怕的想法。

请注意,他们在最后一个子弹中放弃了这一点,但文章的其余部分似乎错过了这是使用xpath时的基本思想。

  

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