【问题标题】:Retaining text formatting in XML在 XML 中保留文本格式
【发布时间】:2017-12-04 00:58:50
【问题描述】:

我有一些数据想要存储在 XML 文件中。 (不一定是 XML,但 XML 是一种很好的开放格式。)

数据由节点和子节点组成(深度没有限制),每个节点都可以有一些文本。

我的数据可能如下所示:

<?xml version="1.0" ?>
<nodes>
  <node title="root">
    <node title="child1">
      Here is some text for child1.
    </node>
    <node title="child2">
      Here is some text for child2.
    </node>
    <node title="child3">
      Here is some text for child3.
    </node>
    Here is some text for root.
  </node>
</nodes>

但是这种方法的问题是我最终会得到很多原始文本中没有的空白。例如,我的根节点的文本有 10 个换行符和一堆制表符(或空格),以便很好地格式化子节点。

以这种方式使用 XML 存储数据,但不添加任何额外的空白字符,准确保留原始文本,有什么好的方法?

注意:我假设我可以只拥有没有换行符或缩进的所有数据:

<?xml version="1.0" ?>
<nodes>
  <node title="root"><node title="child1">Here is some text for child1.
</node><node title="child2">Here is some text for child2.
</node><node title="child3">Here is some text for child3.
</node>Here is some text for root.
</node>
</nodes>

我想这消除了任何新的空白。但这是最好的方法吗?它几乎是丑陋的。一些 XML 查看器可能会通过添加空格来格式化标签。

【问题讨论】:

  • XML 不是一种格式。 XML 是一种用于描述其内容的文档标记语言。它的显示方式与 XML 无关。如果您想更改它的显示方式,请设置您的编辑器来执行此操作。
  • @Rob:我不相信有人说 XML 是一种格式。但是有一些标准的方法来格式化 XML 标记,我有一个编辑器,如果我要求它会自动执行它。我只是想弄清楚如何在 XML 文档中安全地存储文本,并确保我不会得到任何额外的字符。此外,如果文档易于阅读,那就太好了,但也许这要求太多了。
  • 您的第一句话:XML 是一种不错的开放格式。是的,你的编辑可以做到这一点。不,XML 不能。
  • @Rob:好吧,好吧。 Wikipedia 将 XML 定义为 “一种标记语言,它定义了一组规则,用于以人类可读和机器可读的 格式 编码文档。” 这就是我的意思它。但是,好吧,这不是一种格式。

标签: xml


【解决方案1】:

让我们分别考虑未混合和混合内容:

非混合内容

当您的元素之间不能混合文本时,只需根据需要管理元素内的空白,并允许 XML 序列化程序和编辑器管理元素之间的空白:

<?xml version="1.0" ?>
<nodes>
  <node title="root">
    <node title="child1">Here is some text for child1.</node>
    <node title="child2">Here is some text for child2.</node>
    <node title="child3">Here is some text for child3.</node>
  </node>
</nodes>

这适用于面向数据和面向文档的 XML。 (OOXML 是一个不需要混合内容的面向文档的 XML 示例。)

混合内容

当文本可以在元素之间混合时,请根据数据的语义决定如何管理空白。例如,如果您的数据类似于 HTML,则多个连续空格与单个空格没有什么不同,因此允许 XML 序列化程序和编辑器管理空格就可以了:

<?xml version="1.0" ?>
<nodes>
  <node title="root">
    <node title="child1">Here is some text for child1. </node>
    <node title="child2">Here is some text for child2. </node>
    <node title="child3">Here is some text for child3. </node>
    Here is some text for root.
  </node>
</nodes>

xml:space

如果您的 XML 的某些部分将重要性与嵌入的空白相关联,您可以通过向包含元素添加特殊的 xml:space="preserve" 属性来表示这一点:

2.10 White Space Handling

在编辑 XML 文档时,使用“空白”通常很方便 (空格、制表符和空行)将标记分开以获取更大的 可读性。这种空白通常不打算包含 在文档的交付版本中。另一方面, “显着”的空白应该保留在交付的 版本很常见,例如在诗歌和源代码中。

XML 处理器必须始终传递文档中的所有字符 没有标记到应用程序。验证 XML 处理器 还必须通知应用程序这些字符构成 元素内容中出现空白。

一个名为xml:space 的特殊属性可以附加到一个元素上 表示在该元素中应该使用空白 由应用程序保存。在有效文档中,此属性,如 任何其他,如果使用,必须声明。声明时,必须是 作为枚举类型给出,其值为以下之一或两者 "default""preserve"

不过,您应该谨慎使用xml:space="preserve"。将其放在复杂 XML 格式(如 OOXML)的根元素上可能会生成consumers of your data justifiably unhappy

【讨论】:

  • 我还读到对 xml:space 的支持参差不齐。但这肯定是一个完整的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多