2011-05-25 201 views
3

我有一個應用程序,我想用XML文件來存儲:(1)文檔的原始文本;(2)幾個實體即使用字符偏移量「指向」原始文本。例如: -在XML中保留原始換行符類型( r vs r n)

<Document> 
    <OriginalText>This is a test</OriginalText> 
    <Word start_offset="0" end_offset="4" id="w1"/> 
    <Word start_offset="6" end_offset="7" id="w2"/> 
    <Word start_offset="8" end_offset="9" id="w3"/> 
    <Word start_offset="10" end_offset="14" id="w4"/> 
</Document> 

不過,我擔心一個潛在的問題 - 我在輸入文檔的內容沒有控制權,因此它可能包含「\ n」或「\ r \ n」換行。然而,XML規範[1]表示:

的XML處理器必須表現得好像它 歸一化在外部 解析實體(包括 文件實體)上輸入,所有線斷裂之前 解析,通過平移包含 兩個字符的序列#xD #xA和任何#xD後面沒有#xA的單個#xA字符。

即,在應用程序查看XML文件之前,換行符會被標準化。不幸的是,在我看來,這可能會導致字符偏移。例如,在偏移被標準化之前在偏移量173處的字符可以在偏移被標準化後在偏移量168處。我的問題:

  1. 我是否正確解釋XML規範?

  2. 我假設只是對換行符進行編碼(即用& #xD;替換\ r)並不能解決問題,因爲編碼字符將在XML處理器規範換行符之前被替換。那是對的嗎?

  3. 任何人都可以推薦一個好的解決方案嗎?我考慮過的一種解決方案是用其他字符(空格或一些「特殊」字符)替換\ r字符,否則這些字符會在標準化過程中被刪除。但如果可能的話,我不想修改原始文檔文本。另一個可能的解決方案是編碼原始文檔(例如使用base64或uuencode),但我真的不想這樣做,因爲這會使XML文件更難以閱讀&的使用。

(使用字符偏移點進文檔不是可以改變一個設計的決定,因爲我需要與使用字符偏移點到文檔中的文字等工具集成。)

[1] http://www.w3.org/TR/REC-xml/#sec-line-ends

回答

4

我明白你引用的規範的一部分的方式是,所有類型(文字)CR字符會被替換,他們解析之前被替換。因此被表示爲字符引用&#xD;將不會與LF更換,因爲更換應解析(或者它應該工作,好像它解析之前完成)之前完成並在字符引用被轉換爲字符數據任何CR XML解析。請注意,CR中的CDATA部分將被替換,但再次,CDATA部分中的字符引用將不會被解析爲它們引用的實際字符。

因此,如果您將它們作爲字符引用序列化,您應該能夠保留您的換行符。但是,請注意:我不會指望所有的XML工具都遵守這個約定。如果解析的XML被髮送到另一個解釋內容的工具,您也可能會丟失CR

此外,通過字符位置索引數據聽起來對我來說非常脆弱。請考慮你能否找到另一種標記或分段數據的方法。如果你需要堅持基於字符位置的索引,我會建議以某種方式規範化文本數據。畢竟,換行不是唯一可能的失敗點。其他包括重音字符和連字。

+0

關於 在*解析之後被轉換*,而解析之前完成規範化的觀點是一個很好的觀點 - 我將試驗我的工具並瞭解它們的反應。 – 2011-05-25 17:35:40

+0

我同意字符偏移量有些脆弱,但是有一個外部要求是「偏離註釋」 - 也就是說,我們需要能夠指向外部存儲的不可變源文檔。在這種情況下,很難避免使用某些類型的偏移量(字節或字符)。 – 2011-05-25 17:38:52

+0

我用Java的「javax.xml」解析器運行了一些測試,至少在這種情況下 沒有得到標準化。 – 2011-05-25 18:10:14

0

如果不能保證換行是否會被保留,那麼我的直覺就是將它們全部轉換爲<br />

相關問題