在XML中保留原始换行符类型(\ r \ n vs \ r \ n)

时间:2011-05-25 16:16:06

标签: xml newline

我有一个应用程序,我想使用XML文件来存储:(1)文档的原始文本,以及(2)使用字符偏移“指向”原始文本的几个实体。 E.g:

<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. 我假设只编码换行符(即用&amp; #xD替换\ r \ n)将无法解决问题,因为在XML处理器规范化换行符之前,编码的字符将被替换。这是对的吗?

  3. 有人可以推荐一个好的解决方案吗?我考虑过的一个解决方案是替换\ r \ n字符,否则这些字符会在标准化过程中被其他字符(空格或某些“特殊”字符)删除;但如果可能的话,我宁愿不修改原始文件。另一种可能的解决方案是对原始文档进行编码(例如使用base64或uuencode),但我真的不愿意这样做,因为它会使XML文件更难以阅读和使用

  4. (使用字符偏移指向文档不是可以更改的设计决策,因为我需要与使用字符偏移指向文档文本的其他工具集成。)

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

2 个答案:

答案 0 :(得分:4)

我理解你引用的规范部分的方式是所有类型的(文字)CR字符被替换,并且在解析之前它们被替换。因此,任何表示为字符引用CR的{​​{1}}都不会被&#xD;替换,因为在解析之前应该替换(或者它应该像它将在解析之前完成)并且在XML解析期间将字符引用转换为字符数据 。请注意,LF部分中的CR也会被替换,但CDATA部分中的字符引用将不会被解析为它们引用的实际字符。

因此,如果您将换行符序列化为字符引用,则应该能够保留换行符。但是,请注意:我不会指望所有XML工具都遵守此约定。如果解析的XML被发送到另一个再次解释内容的工具,你也可能会丢失CDATA

另外,按字符位置索引数据对我来说听起来很脆弱。请考虑您是否可以找到另一种标记或分段数据的方法。如果您需要坚持基于字符位置的索引,我建议以某种方式规范化文本数据。毕竟,换行不是唯一可能的失败点。其他包括例如重音字符和连字。

答案 1 :(得分:0)

如果无法保证是否会保留换行符,那么我的直觉就是将它们全部转换为<br />