那麼你可以使用類似Etree,LXML 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中,我認爲我沒有說清楚,我們可以在每個視圖中製作多個視圖和多個標題。在這種情況下你會怎麼做? :) – CaseyJones
它只是一個排序列表(所以我把它合併爲一個,所以它不再有所不同),你可以爲每個元素添加和刪除東西,就像它是一個列表,如果列表中的對象是XmlMixin,那麼它將顯示作爲標記,如果不是,它將顯示爲字符串表示形式。任何混合匹配都是可能的,所以文本,類,文本將元素放在文本的中間。但是,例如使用LXML還有一些重要的優點,搜索更容易。 – joojaa