2013-07-02 69 views
0

我有一組xml文件,這些文件是在類似於結構的樹中定義的。的結構有些象:python object to xml hiearchy

根 - >視圖[{配置,c_header,a_header}]

我想能夠定義這一切在一組Python對象的,並定義了一種方法,O可可以自行反思並根據本地實例化的數據即時生成所有xml。很抱歉,如果我不是很清楚地解釋自己,但是我對OOP和Design Patterns的背景知之甚少,雖然我知道這是可能的,但我似乎無法完全解釋。我試圖找到的是一些關於如何以純粹的OO驅動的方式來處理這樣的項目/體系結構的指南,並且使用了適當的設計模式。任何關於我需要調查什麼模式的建議,類似項目的例子等,都會受到歡迎!

回答

1

那麼你可以使用類似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也不難。

更新:將類更改爲從列表繼承。這使得樹更好地添加/刪除元素窗體。添加了一個示例,展示如何在初始創建後展開樹。

+0

謝謝jooja,我期待着實現我自己的東西沒有巨大的依賴,但這種實現看起來不錯。在我的半成品ascii中,我認爲我沒有說清楚,我們可以在每個視圖中製作多個視圖和多個標題。在這種情況下你會怎麼做? :) – CaseyJones

+1

它只是一個排序列表(所以我把它合併爲一個,所以它不再有所不同),你可以爲每個元素添加和刪除東西,就像它是一個列表,如果列表中的對象是XmlMixin,那麼它將顯示作爲標記,如果不是,它將顯示爲字符串表示形式。任何混合匹配都是可能的,所以文本,類,文本將元素放在文本的中間。但是,例如使用LXML還有一些重要的優點,搜索更容易。 – joojaa