2013-10-29 38 views
2

我正在使用jsoup來做一些xml處理。問題是,它正在替換XML實體,即:»與HTML實體:»保留XML實體輸出(jSoup)

我該如何保留原始(xml)實體?

Groovy腳本:

import org.jsoup.Jsoup 
import org.jsoup.nodes.Document 
import org.jsoup.nodes.Entities 
import org.jsoup.parser.Parser 

String HTML_STRING = ''' 
    <html> 
    <div></div> 
    <div>Some text &#187;</div> 
    </html> 
    ''' 

Document doc = Jsoup.parse(new ByteArrayInputStream(HTML_STRING.getBytes("UTF-8")), "UTF-8", "", Parser.xmlParser()) 
doc.outputSettings().charset("UTF-8") 
doc.outputSettings().escapeMode(Entities.EscapeMode.base) 


println doc.toString() 

結果:

<html> 
<div></div> 
<div> 
    Some text &raquo; 
</div> 
</html> 

如果我使用Entities.EscapeMode.xhtml結果是:

<html> 
<div></div> 
<div> 
    Some text » 
</div> 
</html> 

感謝。

+1

剛纔檢查的API /源和一些討論。看來這在本地是不可能的。我猜你的選擇是手動翻譯或擴展[實體類](https://github.com/jhy/jsoup/blob/master/src/main/java/org/jsoup/nodes/Entities.java)以適合您的需求。 –

+0

是的,我不得不修改以下方法:實體類:字符串轉義(字符串字符串,CharsetEncoder編碼器,EscapeMode escapeMode)。 Tokeniser class:char [] consumeCharacterReference(Character additionalAllowedCharacter,boolean inAttribute) –

+0

您可能希望在[GitHub問題跟蹤器](https://github.com/jhy/jsoup/issues)上爲此創建問題。 –

回答

0

您想要使用EscapeMode.xhtml(如果使用XML解析器而不是HTML解析器,則是默認值)和ascii作爲輸出字符集的組合。

默認輸出字符集是UTF-8,如果輸出字符集直接支持字符(因爲爲什麼會浪費CPU和帶寬以避免不必要的轉義),jsoup將不會使用實體轉義。

如果使用Document.OutputSettings.charset("ascii")將輸出字符集更改爲ascii,則會得到所需的輸出。

如果您使用的是HTML,您可能還希望將輸出語法設置爲XML,否則HTML解析器將嘗試將輸出確認爲HTML並且可以嵌入您的XML DOM樹。

(來源:jsoup的作者)