【问题标题】:Java getNodeName and namespacesJava getNodeName 和命名空间
【发布时间】:2012-12-15 00:51:49
【问题描述】:

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

谢谢

安德斯

【问题讨论】:

    标签: java xml


    【解决方案1】:

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

    【讨论】:

    • 注意事项:如果您使用非命名空间感知 API 解析此文档,getLocalName() 将始终返回 null。确保您的 DocumentBuilder 是命名空间感知的
    • 是的,感谢那个 rmlan... 我在想我查看了 getLocalName 并且它之前确实返回了 null - 这就是为什么我使用前缀沿着 getNodeName 路线走下去的原因。 +1
    • 以下@rmlan 评论:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); factory.setNamespaceAware(true);
    • @VincentBlouin 这对我不起作用。 getLocalName() 不断返回 null 尽管 localName 不是 null
    • @AlaaM。引用 Javadoc:For nodes of any type other than ELEMENT_NODE and ATTRIBUTE_NODE and nodes created with a DOM Level 1 method, such as Document.createElement(), this is always null.
    【解决方案2】:

    试试这个:

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-24
      • 2015-06-22
      • 2010-10-20
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多