2011-04-05 95 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的代碼,否則我們無法證實這一點。

相關問題