【问题标题】:What is the best algorithm to turn an XML file into a key-value structure?将 XML 文件转换为键值结构的最佳算法是什么?
【发布时间】: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


【解决方案1】:

在每个名称的末尾附加一些独特的东西。 Like 变为 Key0_unique ,其中 unique 是升序数字或 guid。

(虽然如果你的“生态系统”现在很大并且还在增长,我会考虑现在而不是以后解决这个问题。)

【讨论】:

    【解决方案2】:

    我认为您最好使用某种 xml-parser。我遇到了类似的问题,并为此编写了我的 xml 解析器,但事实证明,这并不是微不足道的,并且可以改变很多。我不能推荐以下文章来更多地解释问题和常见方法:

    http://elegantcode.com/2010/08/07/dont-parse-that-xml/

    如果你可以为此定义一个模式,你可以使用 jaxb - 又好又简单!

    【讨论】:

    • 我对使用普通解析器或我自己的解析器解析 XML 没有任何问题(我实际上写了其中的一些)。我在发明一种将嵌套 XML 结构序列化为键值结构的算法时遇到了问题。见我的评论:stackoverflow.com/questions/12672801/…
    猜你喜欢
    • 2017-08-22
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 2016-05-29
    相关资源
    最近更新 更多