2013-09-30 99 views
0

我具有類似於在這些主題 1)Replace >, <, & chars that appear inside XML nodes 2)Regular expression to match ">", "<", "&" chars that appear inside XML nodes替換>,<,和&該XML節點

和描述這些的我正在尋找一種解決方案,工作中的問題出現內部字符Java的。 在實踐中,我有一個巨大的XML文件(〜5 MB),我想用它們各自的實體(轉義字符)替換特殊字符,而不更改XML標記。 一個tipical例子應該是:提前

+0

您想用<?替換<爲什麼??你的前後陳述也是一樣的。 –

+1

有什麼特別的原因,你不只是使用CDATA塊?順便說一句,我不會使用這個正則表達式。 @Philip:就我解釋這個問題而言,OP實際上是想反其道而行(即使語法無效的XML在語法上有效)。至少在標題,鏈接和代碼示例中提到了這一點。 – BalusC

+0

你的解釋建議你想''<'到'<',而你的例子顯示了相反的過渡。你能澄清你實際上想要的嗎? – thegrinner

回答

2

<tag><anothertag>& < > </anothertag></tag> (before) 
<tag><anothertag>&amp; &lt; &gt; </anothertag></tag> (after). 

謝謝,我強烈建議你不要使用正則表達式來解析XML,在這種情況下,你不應該使用正則表達式的。

你需要的是一個好的XML解析器/流式傳輸框架,比如SAXStaX(由於文件的大小,我會用後者)。

你基本上會將每一個流媒體事件推送給作者。

一旦識別characters事件,同時用您的閱讀器實例解析文件,而不是直接編寫它,則用其實體替換每個符號,然後寫入被替換的String而不是原來的符號。

注意:here是官方StaX教程,讓你開始。 Here是JEE5參考頁面,其中包含其他信息。

爲什麼不使用Pattern而是使用BufferedReader解析整個文件?

  • 因爲表現會糟糕(在Pattern重新搭配您的5MB文件的每一行)
  • 因爲你Pattern必須是非常複雜的(因此,無法讀取,同樣,表現不好)

更多關於正則表達式XML解析的SO文檔VS正確的XML解析here

編輯

我還沒有考慮一個巨大的,完全畸形XML文件的情況。 在這種情況下,流式傳輸框架可能無法使用,因爲流式傳輸文件首先是而非有效的XML。

如果你已用盡所有其他的選擇,要捏住鼻子關,使用BufferedReader,做這樣的事情(需要闡述的很多 - 不要把它直譯):

String killMe = "<element>blah < > &</element>"; 
// only valuable piece of info here: checks for characters within a node 
// across multiple lines - again, needs a lot of work 
Pattern please = Pattern.compile(">(.+)</", Pattern.MULTILINE); 
Matcher iWantToDie = please.matcher(killMe); 
while (iWantToDie.find()) { 
    System.out.println("Uugh: " + iWantToDie.group(1)); 
    System.out.println("LT: " + iWantToDie.group(1).replace("<", "&lt;")); 
    System.out.println("GT: " + iWantToDie.group(1).replace(">", "&gt;")); 
    System.out.println("AND: " + iWantToDie.group(1).replace("&", "&amp;")); 
} 

輸出:

Uugh: blah < > & 
LT: blah &lt; > & 
GT: blah < &gt; & 
AND: blah < > &lt; 
0

這是一個艱難的,因爲據我所知道的事實,即有像> <爲您的XML內容的一部分令牌,你有無效的XML。我最好的建議是找到一個好的XML解析器,如http://dom4j.sourceforge.net/dom4j-1.6.1/,並希望它能處理您的問題。