我正在尝试关注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/”。
答案 0 :(得分:2)
配置DocumentBuilder时,必须明确地使其符合名称空间(当没有名称空间时,从xml的前几天开始是一个愚蠢的遗物):
domFactory.setNamespaceAware(true);
作为旁注,该文章中的建议并不是很好。它从根本上忽略了你不关心实际文档中名称空间前缀的含义,它们是无关紧要的。你需要xpath命名空间解析器来匹配你正在使用的xpath表达式,这就是全部。如果你按照他们的建议行事,那么每当文档的前缀发生变化时,你就必须更改你的xpath代码,这是一个可怕的想法。
请注意,他们在最后一个子弹中放弃了这一点,但文章的其余部分似乎错过了这是使用xpath时的基本思想。
但是如果您无法控制XML文件,并且有人可以向您发送他们希望的任何前缀,那么独立于他们的选择可能会更好。您可以像在示例1(HardcodedNamespaceResolver)中那样编写自己的命名空间解析,并在XPath表达式中使用它们。