python对象到xml层次结构

时间:2013-07-02 14:28:37

标签: python oop design-patterns architecture

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

root - >查看[{config,c_header,a_header}]

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

1 个答案:

答案 0 :(得分: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也不难。

更新:将类更改为从列表继承。这使得在树中添加/删除元素形式更好。添加了示例,说明如何在初始创建后展开树。