Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python对象到xml层次结构_Python_Oop_Design Patterns_Architecture - Fatal编程技术网

python对象到xml层次结构

python对象到xml层次结构,python,oop,design-patterns,architecture,Python,Oop,Design Patterns,Architecture,我有一组xml文件,它们是以树状结构定义的。结构有点像: 根->视图[{config,c_头,a_头}] 我希望能够在一组python对象中定义所有这些内容,并定义一个方法,O可以根据本地实例化的数据进行自我反省并动态生成所有xml。对不起,如果我没有很清楚地解释我自己,但是我在OOP和设计模式方面的背景知识很少,虽然我知道这是可能的,但我似乎无法准确地解释。我想找出的是一些指导方针,关于如何以一种纯粹面向对象驱动的方式来处理这样的项目/体系结构,并利用适当的设计模式。任何关于我需要调查什么模式

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

根->视图[{config,c_头,a_头}]


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

嗯,你可以用一些东西,比如,或者漂亮的汤等等。这些可以做到这一点,甚至更多。但是,有时您可能希望在中添加一些实施细节,但这些细节对任何一个都不实用,因此您可以自己实施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()
类XmlMixin(列表):
"""
提供基本功能的简单类
xml序列化能力
类使用作为列表的属性子级
用于递归结构。
"""
定义初始(自我,*子项):
列表。\uuuuu init\uuuuuuuuuuu(自我,子对象)
def to_xml(self):
数据='%(内部)s'
tag=self.\uuuuuu class.\uuuuuuu name.\uuuuuuuu.lower()
内部=“”
儿童自我:
尝试:
内部+=子项到_xml()
除:
内部+=str(子级)
返回数据%1()
#这些类可能有一些示例类
#一些实施细节
类根(XmlMixin):
通过
类视图(XmlMixin):
通过
类配置(XmlMixin):
通过
A类_头(XmlMixin):
通过
根=根(
看法(
配置(“我的配置”),
标题(“酷东西”)
)
)
#向层次结构添加内容
root.append(
看法(
配置(“其他配置”),
A_标题(“不太酷”)
)
)
将root.to_xml()打印
但是就像我说的那样,使用一些库函数,这样你就不需要实现那么多,你也可以得到一个阅读器。很难实现from_xml也不难


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

谢谢jooja,我希望实现我自己的东西,而不需要太多依赖项,但是这个实现看起来不错。在我的半成品ascii中,我认为我没有明确说明我们可以在每个视图中创建多个视图和多个标题。在这种情况下,您将如何做到这一点?:)它只是一个排序列表(因此我将其划分为一个排序列表,以便不再排序),您可以为每个元素添加和删除内容,就像它是一个列表一样。如果列表中的对象是XmlMixin,那么它将显示为标记,如果不是,它将显示为字符串表示。任何混合匹配都是可能的,因此文本、类、文本将元素放在文本的中间。但是,使用LXML仍然有一些重要的优点,例如,搜索更容易。