【发布时间】:2012-11-09 18:49:28
【问题描述】:
我有这样的 XML 文件:
<root>
<key0>value</key0>
<key1>value</key1>
<key2>value</key2>
</root>
将此类文件转换为键值结构很容易。让我们在 Python dict 中展示结果,例如:
{'key0': 'value', 'key1': 'value', 'key2': 'value'}
现在他们添加了嵌套元素:
<root>
<key0>value</key0>
<key1>value</key1>
<key2>value</key2>
<key3>
<sth0>value</sth0>
<sth1>value</sth1>
</key3>
</root>
还是很简单的:
{'key0': 'value', 'key1': 'value', 'key2': 'value', 'key3/sth0': 'value', 'key3/sth1': 'value'}
我想你明白了。现在这个呢?
<root>
<key0>value</key0>
<key1>value</key1>
<key1>
<inner>value</inner>
</key1>
<key2>value</key2>
<key3>
<sth0>value</sth0>
<sth1>value</sth1>
</key3>
<key3>
<sth0>different value</sth0>
<sth1>different value</sth1>
</key3>
<key3>
<sth0>blah blah</sth0>
<sth1>blah blah</sth1>
</key3>
</root>
当然,经过一段时间的思考,我可以想出一些东西,但有些东西告诉我,我会遇到越来越多的困难。所以问题是:是否有一种复杂的算法可以将类似简单的 XML 文件中的值“序列化”为键值形式?它必须是确定性可序列化和不可序列化的,并且不能丢失任何值。元素的顺序无关紧要(示例中的 Python dict 不是随机选择,这确实是我想要得到的)。
我知道 XML 可能非常复杂(命名空间、属性等),但事实并非如此。我需要正确解决的唯一问题是呈现的嵌套值以及相同键的相关多重性。
【问题讨论】:
-
为什么不使用XML作为数据,使用XPath查询数据呢?已经有许多预构建的库实现了这一点。这个lxml.de 甚至也有'objectify',听起来很接近你想要的。我不会像你那样命名子元素。我会将具有子元素的元素放入集合中。
-
我知道将这些 XML 转换为“对象”或“文档”是最好的,但我现在不能这样做。这是因为我有很多专门使用键值结构的遗留代码。我必须重写整个生态系统,这现在是不可能的。我需要一个中间步骤。
-
您可以在每个名称的末尾附加一些独特的内容。就像
变成 Key0_unique ,其中 unique 是一个升序数字或 guid。 -
如果你把它写成答案,我可以接受。我使用了类似的算法,我认为这是解决我提出的问题的最佳方法。
标签: xml serialization xml-parsing key-value