为什么不能从org.w3c.dom解析ü,ö,ä,& c中的getNodeValue()。

时间:2011-04-05 14:17:11

标签: java xml dom

我正在使用getNodeValue()中的org.w3c.dom.Node来获取XML标记值。如果一个值包含ä,ö,ü或其他类似的特殊字符,我的程序就会切断字符串;例如“Türen”将成为“T”。如何使用特殊字符获取完整值?

我调用getTextValueOfFirstChild来获取textvalue

 public static String getTextValueOfFirstChild(Node node, String childName)
 {
                Node node1;
                Node node2;
                if((node1 = getFirstChildNode(node, childName)) != null && (node2 = node1.getFirstChild()) != null)
                    return node2.getNodeValue();
                else
                    return null;
}

public static Node getFirstChildNode(Node parent, String name)
{
        if(parent != null)
        {
            NodeList nodelist;
            int i = (nodelist = parent.getChildNodes()).getLength();
            for(int j = 0; j < i; j++)
            {
                Node node = nodelist.item(j);
                if(name.equals(node.getNodeName()))
                    return node;
            }

        }
        return null;
}

<carinfo>
<id>l3nqd2dpwikl</id>
<makename>Fiat</makename>
<modelname>Ducato</modelname>
<typename>HKAWA 30 L2H2 120 Multijet</typename>
<bodytype>2/3 Türen</bodytype>
<extrainfo/>
<bodycolorid/>
<intcolorid>0</intcolorid>
<logo/>

3 个答案:

答案 0 :(得分:2)

这可能是因为有问题的节点是文本节点,并且只包含字符串的第一部分。它的下一个兄弟将是另一个包含重音字符的节点,它将包含一个包含字符串最后部分的兄弟。

解析器可以自由地以这种方式构建节点,并且可能是这样做的,因为它遇到了重音字符作为实体。

这主要是猜测,我应该补充一下。

在任何情况下,我建议不要使用文本节点,而是调用get元素,并调用getTextContent()方法,该方法将遍历所有子节点并将它们构建为单个字符串。 / p>

答案 1 :(得分:1)

如果特殊字符作为实体引用出现在源XML中,那么您可能在DOM中将实体节点作为元素节点的子节点,并且您的代码可能无法正确处理实体节点:您可能会错误地认为所有文本都在一个文本节点中。 (这是使用DOM这么痛苦的很多原因之一 - 您是否考虑过替代方案?)

答案 2 :(得分:0)

我的理论是OP的应用程序正在使用错误的字符集/编码来读取XML。不幸的是,除非他/她发布用于解析XML以创建DOM的代码,否则我们无法确认这一点。