<tag><anothertag>& < > </anothertag></tag> (before)
<tag><anothertag>& < > </anothertag></tag> (after).
謝謝,我強烈建議你不要使用正則表達式來解析XML,在這種情況下,你不應該使用正則表達式的。
你需要的是一個好的XML解析器/流式傳輸框架,比如SAX或StaX(由於文件的大小,我會用後者)。
你基本上會將每一個流媒體事件推送給作者。
一旦識別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("<", "<"));
System.out.println("GT: " + iWantToDie.group(1).replace(">", ">"));
System.out.println("AND: " + iWantToDie.group(1).replace("&", "&"));
}
輸出:
Uugh: blah < > &
LT: blah < > &
GT: blah < > &
AND: blah < > <
您想用<?替換<爲什麼??你的前後陳述也是一樣的。 –
有什麼特別的原因,你不只是使用CDATA塊?順便說一句,我不會使用這個正則表達式。 @Philip:就我解釋這個問題而言,OP實際上是想反其道而行(即使語法無效的XML在語法上有效)。至少在標題,鏈接和代碼示例中提到了這一點。 – BalusC
你的解釋建議你想''<'到'<',而你的例子顯示了相反的過渡。你能澄清你實際上想要的嗎? – thegrinner