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

2023-12-28

我有一个应用程序,我想在其中使用 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 的 #xD 到单个 #xA 字符。

即,在应用程序看到 XML 文件之前,换行符会被标准化。不幸的是,在我看来,这可能会消除字符偏移。例如,在偏移量标准化之前位于偏移量 173 的字符在偏移量标准化之后可能位于偏移量 168 处。我的问题:

  1. 我是否正确解释了 XML 规范?

  2. 我认为仅对换行符进行编码(即将 \r 替换为 )并不能解决问题,因为编码的字符将在 XML 处理器标准化换行符之前被替换。那是对的吗?

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

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

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


我对您引用的规范部分的理解是,所有typed(文字)CR字符被替换并且它们在解析之前被替换。因此任何CR表示为字符引用&#xD;不会被替换为LF因为应该进行更换解析之前(或者它应该像在解析之前完成一样工作)并且字符引用被转换为字符数据在 XML 解析期间。请注意,还CRs in CDATA部分被替换,但话又说回来,字符引用CDATA部分不会被解析为它们引用的实际字符。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 XML 中保留原始换行符类型(\r 与 \r\n) 的相关文章

随机推荐

  • oracle将数字转换为日期sql

    我正在尝试转换一个数字 yyyymmdd 迄今为止 mm dd yyyy 例如 20150302 gt 03 02 2015 你可以试试这个 select to date 20150302 yyyymmdd from dual or sel
  • 多对多 Spring Data JPA 关系中的额外列,变化最小

    我需要更改项目的模型 现在 我们有两个具有双向多对多关系的类 这意味着在关系表中 现在需要向关系添加额外的信息 我的问题是 唯一的方法是为关系创建一个类 例如 使用与已存在的关系表相同的名称创建一个类 我这么问是因为如果我们需要改变项目中的
  • 有没有办法在 Visual Studio 中自动更新已安装的 NuGet 包?

    正如标题所示 我想知道是否有一种方法可以在包源中出现新版本时自动更新已安装的 NuGet 包 该用例是一个将某些公司策略 代码分析 签名等 应用于我们的项目的包 一旦该包更新 我希望能够为此包配置自动更新 我确实知道 NuGet 有一个包恢
  • Python 列表是否保证其元素保持插入的顺序?

    如果我有以下Python代码 gt gt gt x gt gt gt x x 1 gt gt gt x x 2 gt gt gt x x 3 gt gt gt x 1 2 3 Will x保证永远是 1 2 3 或者临时元素的其他顺序是否可
  • Xpath选择多个标签

    我想要使 用 PHP DOMXPath 查询的多个标签 td 和 th 我该怎么做 您可以使用 联盟 运营商 这是一个例子 doc new DOMDocument doc gt loadHTML table tr th table head
  • 使用自动滚动向面板添加控件 (c#)

    我有一个带有属性的面板AutoScroll true 通过动态地将其他控件添加到面板而不滚动 一切正常 void addControl int top 13 this Controls Count cmdSet Height ucComma
  • 如何定义 R 函数的参数类型?

    我正在编写一个 R 函数 并且我想确保我的 R 函数的参数属于某个类 例如 矩阵 做这个的最好方式是什么 假设我有一个函数 foo 它计算矩阵的逆 foo lt function x I want to make sure x is of
  • 名称冲突的类的构造函数

    我正在使用 clang 使用 c 14 方言编译我的代码 举个例子 class x int i public x int i this gt i i void x void f class x my x Do something here
  • jboss 7.1 xalan 问题?

    我正在尝试在 JBoss7 上创建基于 Apache Jena 的应用程序 Apache Jena 使用 Xalan 2 11 0 JBoss 7 附带 2 7 1 当我尝试调用该应用程序时 出现异常 其根源是 org apache xer
  • 记录函数闭包

    例如 假设我的包中有一个函数闭包 f function x x x g function y x lt lt y h function x list g g h h l f 5 l g 10 l h 什么是正确的 在官方CRAN http
  • JFactory导入失败

    我正在尝试为 Android 应用程序制作一个登录系统 该系统可与我的 2 5 Joomla 网站一起使用 我试图通过制作一个 Joomla 插件来做到这一点 Android 应用程序将发布数据发送到 php 文件 然后该文件对用户进行身份
  • 减少 Swing 应用程序中耦合的设计模式

    大家好 我目前正在开发 Java Swing 应用程序 并且正在寻找一些指导 该应用程序相当小 但我注意到 随着代码库变得越来越大 我的对象图中存在大量耦合 我对 Swing 比较陌生 但我已经编程了足够长的时间 知道它的发展方向 我遇到的
  • Django 中间件并获取视图名称?

    我正在尝试用 Django 编写我的第一个中间件 class RefreshBalance def process view self request view func view args view kwargs pass 我想检测视图是
  • volatile int 比 AtomicInteger 快吗

    我目前正在做一个示例练习 我发现一个奇怪的观察结果 如果我用易失性程序替换 AutomicInteger 则运行速度会更快 注意 我只进行读操作 code import java util ArrayList import java uti
  • 如何访问 Backbone 视图中的父元素?

    在 Backbone 模型视图中 似乎 this el parent 不起作用 从视图中选择父元素的最佳方法是什么 我正在使用设置 eltagName li 为了景观 默认情况下 Backbone 分配一个空的div到你的视图中 你无法访问
  • 如何使用opencv python解决theta迷宫?

    I have to find shortest path from the center of the maze to the outermost circle I have to solve this problem using open
  • 检查 WHERE 子句中参数是否为 NULL

    我在执行一个存储过程时遇到了麻烦 该过程需要永远执行 它相当大 我可以理解我需要一些时间 但这个持续了将近 20 分钟 经过一些调试和研究后 我注意到替换这部分WHERE clause p DrumNo IS NULL OR T ORDER
  • 获取不同项目及其数量的列表

    我有一个对象 它有很多属性 但唯一需要担心的两个是 myobject ID这是一个int myobject Names这是一个HashSet 然后我有一个List这些对象看起来与此类似 List
  • 如何从 Jupyter Notebook 中的 .py 文件调用函数?

    我不想在每个 Jupyter Notebook 文件中编写相同的函数 如果我只需要编辑一次函数而不需要在每个 ipynb 文件中进行编辑 那就更容易了 问题是 如果我编辑 py 文件 我必须重新启动内核 这将重新启动一切 有什么方法可以简单
  • 在 XML 中保留原始换行符类型(\r 与 \r\n)

    我有一个应用程序 我想在其中使用 XML 文件来存储 1 文档的原始文本 以及 2 使用字符偏移量 指向 原始文本的多个实体 例如