Java getNodeName和名称空间

时间:2012-12-14 16:16:49

标签: java xml

鉴于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

2 个答案:

答案 0 :(得分:8)

试试这个:

if (element.getLocalName().equals("messageheader") &&
    "http://www.somewhere.com/X".equals(element.getNamespaceURI())) { ...

无论前缀如何,都必须检查本地名称和命名空间是否匹配。

答案 1 :(得分:7)

使用getLocalName()代替getNodeName()。这将返回元素的非限定名称。