2012-02-04 56 views
0

我的代碼不檢索包含特殊字符的整個元素節點。 例如,對於這個節點:用Java讀取包含特殊字符(&, - 等)的XML文檔節點

<theaterName>P&G Greenbelt</theaterName> 

它只會檢索「P」由於符號。我需要檢索整個字符串。

這裏是我的代碼:

public List<String> findTheaters() { 

    //Clear theaters application global 
    FilmhopperActivity.tData.clearTheaters(); 

    ArrayList<String> theaters = new ArrayList<String>(); 

    NodeList theaterNodes = doc.getElementsByTagName("theaterName"); 

    for (int i = 0; i < theaterNodes.getLength(); i++) { 

     Node node = theaterNodes.item(i); 
     if (node.getNodeType() == Node.ELEMENT_NODE) { 

      //Found theater, add to return array 
      Element element = (Element) node; 
      NodeList children = element.getChildNodes(); 
      String name = children.item(0).getNodeValue(); 
      theaters.add(name); 

      //Logging 
      android.util.Log.i("MoviefoneFetcher", "Theater found: " + name); 

      //Add theater to application global 
      Theater t = new Theater(name); 
      FilmhopperActivity.tData.addTheater(t); 
     } 
    } 

    return theaters; 
} 

我嘗試添加代碼擴展名字符串來連接額外的children.items,但沒有奏效。我只會得到「P &」。

... 
String name = children.item(0).getNodeValue(); 
for (int j = 1; j < children.getLength() - 1; j++) { 
    name += children.item(j).getNodeValue(); 
} 

謝謝你的時間。


UPDATE: 找到一個函數調用正常化(),您可以在節點調用,它結合了所有文本子節點這樣一個children.item(0)包含了所有的兒童,包括與符號的文字!

+0

簡單地說,&XML不允許在XML內容中使用,因此您嘗試解析的XML無效。 – dbrin 2012-02-04 04:08:25

回答

5

&是XML中的轉義字符。 XML看起來像這樣:

<theaterName>P&G Greenbelt</theaterName> 

實際上應該被解析器拒絕。相反,它應該是這樣的:

<theaterName>P&amp;G Greenbelt</theaterName> 

有幾個這樣的字符,如<(&≤),>(& 1+),"(& QUOT)和'(&者; )。還有其他方法可以轉義字符,例如通過Unicode值,如&#x2022;或&#12345 ;.

欲瞭解更多信息,XML specification是相當清楚。

現在,它可能是另一件事,取決於你的樹是如何構建的,正確轉義的字符,並且你展示的樣本不是實際存在的,它是如何表示數據的在樹上。

例如,當使用SAX構建樹時,實體(&-things)被分解並分開傳遞。這是因爲SAX解析器試圖返回連續的數據塊,並且當它到達轉義字符時,它會發送它所具有的內容,並開始一個新的塊,其中包含已翻譯的&值。因此,您可能需要在樹中組合連續的文本節點才能獲得整個值。

+0

我從Web動態檢索我的XML。獲取Document對象之後替換所有轉義字符的最佳方法是什麼? – Dan 2012-02-04 04:08:56

+0

請注意,只有在用這些字符引用的屬性中,「quot」和「apos」必須表示爲實體。 – beerbajay 2012-02-04 09:08:20

+0

@Dan您提取的XML是否將它們轉換爲未轉義?您應該讓該XML的生產者糾正它,因爲無效的XML是由標準中的定義而不是實際的XML定義的。如果不可能讓生產者修復它,那麼你必須在本地提取文件,比如說讀取一個字符串,然後做一個搜索和替換。但是,如果它正確地轉義,你的XML解析器應該爲你處理所有的細節。 – lavinio 2012-02-04 20:05:46

0

您需要對其進行正確編碼或將其包裝在CDATA部分。我會推薦前者。

0

數值字符引用"&#60;""&#38;"可以用於當它們發生在字符數據逃脫<&
所有的XML處理器必須識別這些實體是否被聲明。對於interoperability,有效的XML文檔應該在使用它們之前聲明這些實體,就像任何其他實體一樣。如果實體ltamp被聲明,它們必須被聲明爲internal entities的替換文字是character reference到相應的字符(小於符號或符號)被轉義;對於這些實體,雙重轉義是REQUIRED,因此對它們的引用會產生良好結果。如果聲明瞭實體gt,aposquot,則它們的必須被聲明爲internal entities,其替換文本是被轉義的單個字符(或對該字符的字符引用;這裏的雙重轉義是可選的但是無害的)。例如:

<!ENTITY lt  "&#38;#60;"> 
<!ENTITY gt  "&#62;"> 
<!ENTITY amp "&#38;#38;"> 
<!ENTITY apos "&#39;"> 
<!ENTITY quot "&#34;"> 
2

您試圖閱讀的文件是無效的XML。沒有自尊的XML解析器會接受它。

我從Web動態檢索我的XML。獲取Document對象之後替換所有轉義字符的最佳方法是什麼?

您正在採取錯誤的做法。正確的做法是通知負責創建該文件的人員,使其無效,並要求他們修復該文件。簡單地寫入黑客(嘗試修復)破壞的XML不在您(或其他人)的長期利益之中。

如果您決定忽略了這個建議,那麼一種方法是把文件讀入一個字符串,使用String.replaceAll(正則表達式,替換)用合適的正則表達式來把這些假"&"字符轉換成正確的字符實體("&amp;") ,然後將固定的XML字符串提供給XML解析器。您需要仔細設計正則表達式,以便它不會將有效的字符實體分解爲不需要的副作用。第二種方法是手動進行解析和替換,使用適當的啓發式方法來區分僞造字符實體中的僞造字符"&"

但是這一切都需要花費開發和測試時間,並且會降低軟件的運行速度。更糟糕的是,由於您努力補償不良輸入文件,您的代碼將變得非常脆弱。 (並猜測誰將會受到指責......)

相關問題