在XML中保留原始换行符类型\\\\ r与\\\\ r \\\\ n

问题描述

|| 我有一个要使用XML文件存储的应用程序:(1)文档的原始文本,以及(2)使用字符偏移量“指向”原始文本的几个实体。例如。:
<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以及#xA之后没有跟#xA到单个#xA字符的任何#xD。 即,换行符在应用程序查看XML文件之前已被规范化。不幸的是,在我看来,这样可能会偏离字符偏移量。例如,在偏移量归一化之前位于偏移量173处的字符可能在偏移量归一化之后位于偏移量168处。我的问题: 我是否正确解释了XML规范? 我假设仅对换行进行编码(即用&#xD;替换\\ r)不会解决问题,因为在XML处理器规范换行符之前将替换编码的字符。那是对的吗? 谁能推荐一个好的解决方案?我考虑过的一种解决方案是用标准化的其他字符(空格或某些“特殊”字符)替换在标准化过程中会被删除的\ r字符;但是如果可能的话,我不希望修改原始文档文本。另一种可能的解决方案是对原始文档进行编码(例如,使用base64或uuencode),但是我宁愿不这样做,因为这会使XML文件更难以阅读和使用。 (使用字符偏移量指向文档不是可以更改的设计决定,因为我需要与其他使用字符偏移量指向文档文本的工具集成。) [1] http://www.w3.org/TR/REC-xml/#sec-line-ends     

解决方法

我理解您引用的规范部分的方式是,所有键入的(文字)“ 1”字符都将被替换,并且在解析之前会被替换。因此,任何表示为字符引用“ 3”的“ 1”都不会被替换为“ 4”,因为替换应在解析之前完成(或者应像解析之前一样工作),并且在XML解析期间将字符引用转换为字符数据。 。请注意,also6ѭ节中的
CR
也将被替换,但是同样,
CDATA
节中的字符引用也不会解析为它们所引用的实际字符。 因此,如果将换行序列化为字符引用,则应该能够保留换行符。但是,请注意:我不会指望所有XML工具都遵守这一约定。另外,如果将解析的XML发送到另一个再次解释内容的工具,则可能会丢失“ 1”。 同样,按字符位置索引数据对我来说听起来很脆弱。请考虑您是否可以找到另一种标记或细分数据的方法。如果您需要坚持使用基于字符位置的索引,我建议以某种方式标准化文本数据。毕竟,换行不是唯一可能的故障点。其他包括例如重音字符和连字。     ,如果不能保证是否保留换行符,那么我的直觉是将它们全部转换为
<br />
。