将XML文件转换为键值结构的最佳算法是什么?

时间:2012-10-01 11:56:29

标签: xml serialization xml-parsing key-value

我有这样的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可能非常复杂(命名空间,属性等等),但事实并非如此。我需要正确解决的唯一问题是所呈现的嵌套值以及相同键的相关多重性。

2 个答案:

答案 0 :(得分:0)

我认为最好使用一些xf-parser sortf。我有类似的问题,并为此编写我的xml解析器,但事实证明 - 它不是微不足道的,可以改变很多。我不能推荐以下文章更多地解释问题和常见的方法:

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

如果你可以为它定义一个模式,你可以使用jaxb-nice和easy!

答案 1 :(得分:0)

在每个名称的末尾附加一些唯一的内容。就像变成Key0_unique一样,唯一的是一个递增的数字或guid。

(虽然如果你的“生态系统”现在很大并且在不断增长,我会考虑现在而不是以后对它进行排序。)