我有一個應用程序,我想用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處。我的問題:
我是否正確解釋XML規範?
我假設只是對換行符進行編碼(即用& #xD;替換\ r)並不能解決問題,因爲編碼字符將在XML處理器規範換行符之前被替換。那是對的嗎?
任何人都可以推薦一個好的解決方案嗎?我考慮過的一種解決方案是用其他字符(空格或一些「特殊」字符)替換\ r字符,否則這些字符會在標準化過程中被刪除。但如果可能的話,我不想修改原始文檔文本。另一個可能的解決方案是編碼原始文檔(例如使用base64或uuencode),但我真的不想這樣做,因爲這會使XML文件更難以閱讀&的使用。
(使用字符偏移點進文檔不是可以改變一個設計的決定,因爲我需要與使用字符偏移點到文檔中的文字等工具集成。)
[1] http://www.w3.org/TR/REC-xml/#sec-line-ends
關於 在*解析之後被轉換*,而解析之前完成規範化的觀點是一個很好的觀點 - 我將試驗我的工具並瞭解它們的反應。 – 2011-05-25 17:35:40
我同意字符偏移量有些脆弱,但是有一個外部要求是「偏離註釋」 - 也就是說,我們需要能夠指向外部存儲的不可變源文檔。在這種情況下,很難避免使用某些類型的偏移量(字節或字符)。 – 2011-05-25 17:38:52
我用Java的「javax.xml」解析器運行了一些測試,至少在這種情況下 沒有得到標準化。 – 2011-05-25 18:10:14