代码之家  ›  专栏  ›  技术社区  ›  Honza Javorek

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

  •  2
  • Honza Javorek  · 技术社区  · 13 年前

    我有这样的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 回复  |  直到 13 年前
        1
  •  0
  •   Mesh    13 年前

    在每个名称的末尾附加一些唯一的内容。Like变为Key0_unique,其中unique是一个升序或guid。

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

        2
  •  0
  •   bjedrzejewski Nick Sharp    13 年前

    我认为最好使用某种xml解析器。我也遇到了类似的问题,并尝试为此编写xml解析器,但事实证明,这并非微不足道,而且可能会发生很大变化。我无法推荐以下文章来更多地解释这个问题和常见的问题:

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

    如果您可以为此定义一个模式,那么您就可以使用jaxb了——非常简单!