在XML中保留文本格式

在XML中保留文本格式,xml,Xml,我有一些数据要存储在XML文件中。它不一定是XML,但XML是一种很好的开放格式 数据由节点和子节点组成,没有深度限制,每个节点都可以有一些文本 我的数据可能如下所示: <?xml version="1.0" ?> <nodes> <node title="root"> <node title="child1"> Here is some text for child1. </node> <

我有一些数据要存储在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>
<?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 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 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:空间 如果XML的某些部分将重要性与嵌入的空白相关联,则可以通过向包含元素添加一个特殊的XML:space=preserve属性来表示这一点:

在编辑XML文档时,通常可以方便地使用空白 空格、制表符和空行以分隔标记以获得更大的空间 可读性。此类空白通常不用于包含 在文档的交付版本中。另一方面 应在交付的文档中保留的重要空白 版本是常见的,例如在诗歌和源代码中

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

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


但是,您应该注意保守地使用xml:space=preserve。将它放在复杂XML格式(如OOXML)的根元素上很可能会产生错误。

可能是这样吗?XML不是一种格式。XML是一种用于描述其内容的文档标记语言。它的显示方式与XML无关。如果您想更改它的显示方式,请设置编辑器以进行更改。@Rob:我不相信有人说XML是一种格式。但是,有标准的方法来格式化XML标记,我有一个编辑器,如果我要求它,它会自动执行。我只是想弄清楚如何安全地将文本存储在XML文档中,并确保不会出现任何附加字符。另外,如果文档易于阅读就好了,但这可能要求太高了。是的,你的编辑可以做到。不,XML不能。@Rob:好吧,好吧。Wikipedia将XML定义为一种标记语言,它定义了一组用于以人类可读和机器可读的格式对文档进行编码的规则。我就是这个意思。但是,很好,它不是一种格式,我还读到对xml:space的支持参差不齐。但这肯定是一个完整的答案。谢谢