Java getNodeName 和命名空间 [英] Java getNodeName and namespaces

查看:30
本文介绍了Java getNodeName 和命名空间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给定 2 个符合相同架构的 XML 文件(均有效),一个有命名空间,另一个没有(示例):

Given 2 XML files that conform to the same schema (both valid), one has namespaces, the other one has not (sample):

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.

The issue is that the code that parses the file uses the Element.getNodeName() getter to determine node names before extracting and storing the text content. This method was used as opposed to XPath when parsing the XML due to performance.

因此实现了以下示例代码来进行解析:

Therefore the following sample code was implemented to do the parsing:

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.

The above code only works with XML File 2.

是否可以确定文件是否在元素上使用命名空间前缀,以便可以使用 getNodeName() 解析两个文件 - 这样我就可以使用相同的代码来解析两个文件?

Is it possible to determine whether a file uses the namespace prefix on elements so both files can be parsed using getNodeName() - so I can use the same code to parse both files?

我同意这是解析 XML 的一种糟糕方式.不幸的是,我的代码是在切换到我喜欢的 JAXB 之前实现的(目前).

I agree this is an awful way to parse the XML. Unfortunately, my code was implemented before switching to JAXB which I love (for the moment).

谢谢

安德斯

推荐答案

试试这个:

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

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

You have to check that the local name and the namespace match, regardless of the prefix.

这篇关于Java getNodeName 和命名空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆