【问题标题】:python object to xml hierarchypython对象到xml层次结构
【发布时间】:2013-07-02 14:28:37
【问题描述】:

我有一组定义在树状结构中的 xml 文件。结构有点像:

root -> 视图[{ config, c_header, a_header }]

我希望能够在一组 python 对象中定义所有这些,并定义一个 O 可以自省并根据本地实例化数据动态生成所有 xml 的方法。对不起,如果我没有很清楚地解释自己,但我在 OOP 和设计模式方面的背景很少,虽然我知道这是可能的,但我似乎无法准确解释。我试图找出一些关于如何以纯粹的面向对象驱动并利用适当的设计模式的方式处理这样的项目/架构的指南。任何关于我需要调查什么模式、类似项目示例等的建议也非常受欢迎!

【问题讨论】:

    标签: python oop design-patterns architecture


    【解决方案1】:

    你可以使用EtreeLXML Etree 或美汤之类的东西。这些可以做到这一点,甚至更多。但是,有时您可能想要添加一些对其中任何一个都不实用的实现细节,因此您可以自己实现 ETreeFactory 之类的东西,或者至少了解如何继续执行此操作。这个例子做得不是特别好,但应该给你一个提示。

    class XmlMixin(list):
        """
        simple class that provides rudimentary
        xml serialisation capabiities. The class 
        class uses attribute child that is a list
        for recursing the structure.
        """
        def __init__(self, *children):
            list.__init__(self, children)
    
        def to_xml(self):
            data = '<%(tag)s>%(internal)s</%(tag)s>'
            tag = self.__class__.__name__.lower()
            internal = ''
            for child in self:
                try:
                    internal += child.to_xml()
                except:
                    internal += str(child)
            return data % locals()
    
    
    # some example classes these could have 
    # some implementation details
    class Root(XmlMixin):
        pass
    
    class View(XmlMixin):
        pass
    
    class Config(XmlMixin):
        pass
    
    class A_Header(XmlMixin):
        pass
    
    
    root =  Root(
                View(
                    Config('my config'),
                    A_Header('cool stuff')
                )
           )
    
    #add stuff to the hierarchy
    root.append( 
            View(
               Config('other config'),
               A_Header('not so cool')
               )
            )
    
    print root.to_xml()
    

    但就像我说的那样,使用一些库函数代替你不需要实现这么多,你也会得到一个读者。很难实现 from_xml 也不难。

    更新:将类更改为从列表继承。这使得它在树中更好地添加/删除元素。添加了显示如何在初始创建后扩展树的示例。

    【讨论】:

    • 谢谢 jooja,我期待着实现我自己的东西,而不需要很大的依赖,但是这个实现看起来不错。在我半生不熟的 ascii 中,我认为我没有明确表示我们可以在每个视图中创建多个视图和多个标题。在这种情况下你会怎么做? :)
    • 它只是一个排序列表(所以我将其合并为一个,因此它不再是排序),如果列表中的对象是,您可以为每个元素添加和删除内容,就像它是一个列表一样XmlMixin 然后它将显示为标签,如果不是,它将显示为字符串表示形式。任何混合匹配都是可能的,因此 text、class、text 将元素放在文本中间。但是使用 LXML 仍然有一些重要的优势,例如,搜索更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多