鉴于2个XML文件符合相同的模式(两者都有效),一个具有名称空间,另一个没有(样本):
XML文件1
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message xmlns="http://www.somewhere.com/X">
<messageheader>
...
</message>
XML文件2
<?xml version="1.0" encoding="UTF-8"?>
<ns1:message xmlns:ns1="http://www.somewhere.com/X">
<ns1:messageheader>
...
</ns1:message>
问题是解析文件的代码在提取和存储文本内容之前使用Element.getNodeName()getter来确定节点名称。由于性能原因,在解析XML时使用此方法而不是XPath。
因此,实现了以下示例代码来进行解析:
for(int i = 0; i < someElement.getChildNodes().getLength(); i++) {
if(someElement.getChildNodes().item(i).getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
Element element = (Element) someElement.getChildNodes().item(i);
if(element.getNodeName().equals("ns1:messageheader")) {
...
}
...
}
}
以上代码仅适用于XML文件2.
是否可以确定文件是否在元素上使用名称空间前缀,因此可以使用getNodeName()解析这两个文件 - 所以我可以使用相同的代码来解析这两个文件?
我同意这是一种解析XML的糟糕方法。不幸的是,我的代码是在切换到我喜欢的JAXB之前实现的(目前)。
由于
Andez
答案 0 :(得分:8)
试试这个:
if (element.getLocalName().equals("messageheader") &&
"http://www.somewhere.com/X".equals(element.getNamespaceURI())) { ...
无论前缀如何,都必须检查本地名称和命名空间是否匹配。
答案 1 :(得分:7)
使用getLocalName()
代替getNodeName()
。这将返回元素的非限定名称。