我有一个应用程序,它将一系列(浮点)值存储在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>
并且可能还有更多变化。
我只是想知道每种方法的缺点(如果有的话)。例如,有些可能不合规。
答案 0 :(得分:3)
我认为没有“更好”的方式。阅读我上面的评论以寻找替代方但是,如果你迷上了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"}]
答案 1 :(得分:3)
从语义上讲,1和2之间没有“差异”。同样,3和4之间没有区别,除了一个是分隔的。另请注意,XML中可以忽略空格,因此如果您阅读#3,它可能会显示为“一条长线”而没有任何换行符将它们分开。
至于哪个更好,取决于您的应用程序,以及您计划如何使用数据。
序列化版本(每个数字都在自己的元素中)使用户可以“直接”访问各个数字。
使用分隔的“blob”需要用户自己解析它,因此它取决于您希望提供的接口类型。
此外,“blob”技术往往会阻止XML“流式传输”,因为你将拥有一个巨大的元素,而不是一堆小元素。这可能会对内存造成很大影响。
至于整体文件大小,可能有助于知道您实际压缩此数据,最终的压缩大小可能会非常接近,无论采用何种技术。不知道该财产是否重要。
答案 2 :(得分:2)
前两种形式最适合最后两种形式,第一种形式最好。后两者需要读取数据的内容并在使用之前将其拆分。但是,前两个允许您枚举数据并在任何给定时间仅使用您需要的一块或多块。但是,第二种形式通过属性将值嵌入到另一个层中,这使得它比第一种形式更不可取(假设每个特定数据点没有其他元素/属性)。
答案 3 :(得分:1)
如果您的文件将处理的唯一数据将始终只是那些浮点值,请不要使用XML。仅使用每行中包含值的纯文本文件。它的读写速度要快很多倍,并且与你编写的XML样本相比,它的自描述性也不会那么自我描述。
XML可能是一项要求,例如,您将使用来自不同文化(TR,EN,FR)的不同应用程序/系统/用户的XML文件。有人用“。”写浮点数。 (12.34)而有些人用','(12,34)写出来。 XML解析器将为您处理所有这些内容。因此,如果需要XML,那么您编写的第3和第4个示例完全忽略了XML的要点。在实践中,它们与使用纯文本文件没有什么不同,除了值班的慢速XML解析器。
你写的第一和第二个样本在意义/解释上只有微妙的差异。第一个意味着您想要呈现的实际数据是12.34,它是一个“值”。第二个意味着存在“价值”,与之相关的“v”数据为12.34。