2

给定 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 之前实现的(目前)。

谢谢

安德斯

4

2 回答 2

10

使用getLocalName()而不是getNodeName(). 这将返回元素的非限定名称。

于 2012-12-14T16:23:09.660 回答
9

尝试这个:

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

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

于 2012-12-14T16:27:03.600 回答