2011-04-05 57 views
0

我使用org.w3c.dom.NodegetNodeValue()来获取XML标记值。如果一个值包含ä,ö,ü或其他特殊字符,我的程序只会切断字符串;例如“Türen”将变成“T”。我怎样才能得到完整的价值,特殊的字符?为什么不能从org.w3c.dom解析ü,ö,ä,&c。中的getNodeValue()?

我打电话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/> 
+7

问题可能出在您解析XML以创建DOM的方式。我希望你没有使用正确的字符集。请显示代码...和XML文件的前几行。 – 2011-04-05 14:21:43

+0

请重新阅读我的评论。您没有提供我要求的代码*。 – 2011-04-07 02:25:06

回答

1

如果特殊字符在源XML表现为实体引用,那么你可能有实体节点在DOM为儿童元素节点和您的代码可能没有正确处理实体节点:您可能错误地认为所有文本都位于单个文本节点中。 (这其中的很多原因,使用DOM是这样的痛苦一个 - 你有没有考虑替代品?)

+0

+1替代DOM,尽管一些替代品(StAX,我认为)仍然可以通过多个块的文本。 – 2011-04-05 17:25:48

2

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

解析器可以自由地建立节点那个样子,并可能这样做,因为它遇到重音符号的实体。

这主要是猜测,我应该补充。在任何情况下,我都不建议使用文本节点,而是建议获取包含元素,并调用getTextContent()方法,该方法将遍历所有子元素并将它们构建为单个字符串。

0

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

相关问题