【问题标题】:What is the best/correct/most efficient way to store a data series in XML在 XML 中存储数据系列的最佳/正确/最有效的方法是什么
【发布时间】:2010-06-05 04:28:31
【问题描述】:

我有一个应用程序,它将在 XML 文件中存储一系列(浮点)值。可能有超过 100,000 个值,所以我有兴趣减小大小,但我也希望第三方可以轻松访问文件。

就在 XML 中编码数据而言,我似乎有多种方法可供选择:

1.

<data>
  <value>12.34</value>
  <value>56.78</value>
  ...
  <value>90.12</value>
</data>

2.

<data>
  <value v="12.34"/>
  <value v="56.78"/>
  ...
  <value v="90.12"/>
</data> 

3.

<data>12.34
56.78
  ...
90.12
</data> 

4.

<data>12.34, 56.78, ... 90.12</data> 

而且可能还有更多变体。

我只是想知道这些方法的缺点(如果有的话)。例如,有些可能不合规。

【问题讨论】:

  • 您还在使用 XML 吗?这是一种古老的存储格式。您可以尝试使用较小尺寸的 JSON。还要记住,XML 更适合用于传输信息,而不一定是存储它。
  • 您需要 XML 文件中的值的可读性如何?到目前为止的答案假设可读性很重要,但是当我在 XML 文件中存储 100K“平面”值时,我知道我无法手动读取它们,所以可读性并不重要。如果您不需要它们可读,我可以为您提供包装方法,这些方法将占用您上述选择的一小部分空间。
  • 摇滚六弦乐队,康拉德-阿尔布雷希特。使用 XML 的原因是为了让第 3 方应用程序开发人员可以访问数据文件。目前,数据文件是专有的二进制格式,我们必须提供导出为 csv /xls 的功能。如果数据文件是 xml,我们不需要提供任何其他工具。如果使用变体 2(?),JSON 并不是真的更小。 XML 也是可扩展的,因为我们可以在不破坏现有软件的情况下添加数据。我们还可以轻松使用加密/压缩/数字签名/篡改检测技术。
  • 对 JSON 的一个很好的论据是它可以在 javascript(JavaScript 对象表示法)中本地读取。现在还有其他语言使用内置的 JSON 阅读器(例如 .NET)。因此,如果您正在提供数据,那么其他应用程序可以非常简单地使用 JSON。
  • 然而,像 RSS 阅读器这样的东西仍在使用 XML,谷歌的站点地图和类似的东西也是如此。

标签: xml series


【解决方案1】:

我认为没有“更好”的方式来做到这一点。阅读我上面的评论以获取替代方案。但是,如果您迷上了 XML,那么请选择适合您的任何方法。我个人更喜欢这样的东西

<data>
   <item key="somekey1" value="somevalue1" />
   <item key="somekey2" value="somevalue2" />
   <item key="somekey3" value="somevalue3" />
</data>

仅仅是因为它美观且易于阅读,并且标签更小。

编辑:

请记住,XML 中的字符越少,它就越小。 (同样,为什么我建议使用 JSON),所以如果你能把它弄得又好又紧,一定要这样做。

<d>
   <i k="somekey1" v="somevalue1" />
   <i k="somekey2" v="somevalue2" />
   <i k="somekey3" v="somevalue3" />
</d>

编辑:

另外,我知道你没有问,但我想我会向你展示 JSON 的样子

   [{ "key": "somevalue1", "value": "somevalue1"},
    { "key": "somevalue2", "value": "somevalue2"}]

【讨论】:

  • 我不喜欢你的第二种形式。大小是一个考虑因素,但考虑到在较小的大小和具有描述性、有意义的名称的文档之间进行选择,我会牺牲磁盘空间。
  • 我完全同意......我也永远不会使用第二个......只是举例说明如何去除标签。我仍然更喜欢 JSON 而不是 XML。
  • 如果目标是表示一个时间序列的样本(即一个数组),那么当 肯定是多余的/> (或 )会做。 “描述性意义”部分可以在封闭标记中,如下所示:..。我想我会接受尺寸的减小并且仍然具有可读性。
  • 您的意思是“增加”大小并且仍然具有可读性。再一次..我同意,只是展示了另一种选择。如果人类永远不会阅读实际文件,而只是让机器阅读......那么标签是无关紧要的。你说你有 100,000 个值。人类想要破解原始 XML 并阅读它……当然不是我 :-P
  • 对不起...重新阅读您的笔记后,您似乎在说您更喜欢使用较小的标签。
【解决方案2】:

从语义上讲,1 和 2 之间没有“区别”。同样,3 和 4 之间也没有区别,除了一个是分隔的。另请注意,空格在 XML 中是/可以忽略的,因此如果您阅读 #3,它很可能会显示为“一长行”,而没有任何换行符分隔它们。

至于哪个更好,取决于您的应用程序,以及您计划如何使用数据。

序列化版本(每个数字都在其自己的元素中)使用户可以“直接”访问各个数字。

使用分隔的“blob”需要用户自己解析,所以这取决于您希望提供什么样的接口。

此外,“blob”技术往往会阻止 XML 被“流式传输”,因为您将拥有一个巨大的元素,而不是一堆小元素。这会产生很大的内存影响。

至于整体文件大小,了解您实际压缩此数据可能会有所帮助,无论采用何种技术,最终压缩后的大小可能会非常接近。不知道该属性是否重要。

【讨论】:

    【解决方案3】:

    前两种形式优于后两种形式,第一种是最好的。后两者需要读取数据内容并在使用之前对其进行拆分。但是,前两个允许您枚举数据并在任何给定时间仅使用您需要的部分。但是,第二种形式通过属性将值嵌入到另一个层中,这使得它不如第一种形式(假设每个特定数据点没有其他元素/属性)。

    【讨论】:

    • 我同意后两者的部分。尽管您可能能够使文件大小更小,但您必须让服务器更加努力地提取内容。
    • &lt;element&gt;text&lt;/element&gt;&lt;element tag=value /&gt; 之间真的有那么大的区别吗?在 .NET 上,这是 .Text(或者是 .Value)与 .Attribute("tag") 的区别,所以是少了一些字符,但访问方法没有区别。
    • @drachenstein - 是的,我是从 .NET 的角度考虑的,尤其是 LINQ,我可以在其中访问一个值作为 Element.Value(或(float)Element)或 Element.Attribute (somename).Value (... (float)Element.Attribute(somename))。这是一个偏好,但如果我不必将数据嵌入另一层,我会牺牲磁盘空间。
    【解决方案4】:

    如果您的文件将处理的唯一数据始终是那些浮点值,请不要使用 XML。仅使用每行带有值的纯文本文件。它的读写速度会快很多倍,并且不会比您编写的 XML 示例少一点自我描述性。

    XML 可能是一项要求,例如,您将使用来自具有不同文化(TR、EN、FR)的不同应用程序/系统/用户的此 XML 文件。有些人用'.'写浮点数(12.34)而有些人用','(12,34)来写它们。 XML 解析器将为您处理所有这些内容。因此,如果需要 XML,那么您编写的第 3 和第 4 个示例完全忽略了 XML 的意义。实际上,它们与使用纯文本文件没有什么不同,除了值班的慢速 XML 解析器。

    您编写的第一个和第二个样本在含义/解释上只有细微的差别。第一个暗示您想要呈现的实际数据是 12.34,它是一个“值”。第二个意味着有一个“值”,与之关联的“v”数据是12.34。

    【讨论】:

      猜你喜欢
      • 2010-10-06
      • 2012-08-30
      • 2016-05-31
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多