2009-09-29 69 views
24

我喜歡Python,但我不想寫10行來獲取元素的屬性。也許這只是我,但minidom是不是mini。爲了解析使用它的代碼,我必須編寫的代碼看起來很像Java代碼。是否有任何設計時考慮到人類的Python XML解析器?

有什麼是更user-friendly?什麼東西與重載操作符,並將元素映射到對象?

我希望能夠訪問此:


<root> 
<node value="30">text</node> 
</root> 

因爲這樣的事情:


obj = parse(xml_string) 
print obj.node.value 

,而不是使用getChildren或一些其他方法那樣。

+1

XPath算作用戶友好嗎? http://stackoverflow.com/questions/8692/how-to-use-xpath-in-python – Welbog 2009-09-29 17:25:49

+0

我會非常感興趣的Java版本! – Federer 2010-03-10 13:50:22

回答

22

你應該看看ElementTree。這並不是你想要的,但是它比minidom好多了。如果我沒有記錯,從Python 2.4開始,它包含在標準庫中。爲了更快的速度使用cElementTree。要獲得更多速度(和更多功能),您可以使用lxml(根據您的需求/方法檢查物化API)。

我要補充一點BeautifulSoup做你想做什麼部分。也有這種方法的Amara

+3

+1,ElementTree非常棒。 – Mark 2009-09-29 17:41:50

+0

ElementTree非常棒。 – 2009-09-29 18:28:02

+0

同意,ElementTree超級簡單易用。對於花哨的命名空間(尚未)而言並不是那麼好,但是一直在變得更好。儘可能避免使用迷你遊戲機。 – 2009-09-29 20:04:12

3

我實際上寫了一個庫,它完全按照你想象的方式來完成任務。該庫被稱爲「xe」,你可以從它得到:http://home.avvanta.com/~steveha/xe.html

xe可以導入XML,讓你以面向對象的方式處理數據。它實際上使用xml.dom.minidom來執行解析,但是它會遍歷生成的樹並將數據打包到xe對象中。

編輯:好的,我繼續在XE實現你的榜樣,所以你可以看到它是如何工作的。下面是實現您所展示的XML的類:

import xe 

class Node(xe.TextElement): 
    def __init__(self, text="", value=None): 
     xe.TextElement.__init__(self, "node", text) 
     if value is not None: 
      self.attrs["value"] = value 

class Root(xe.NestElement): 
    def __init__(self): 
     xe.NestElement.__init__(self, "root") 
     self.node = Node() 

這裏是使用上述示例。我把你的示例XML放到一個名爲「example.xml」的文件中,但你也可以把它放入一個字符串並傳遞字符串。

>>> root = Root() 
>>> print root 
<root/> 
>>> root.import_xml("example.xml") 
<Root object at 0xb7e0c52c> 
>>> print root 
<root> 
    <node value="30">text</node> 
</root> 
>>> print root.node.attrs["value"] 
30 
>>> 

請注意,在本例中,「值」的類型將是一個字符串。如果你真的需要另一種類型的屬性,那也可能有一點點的工作,但是我沒有爲這個例子打擾。 (如果你看PyFeed,有一個OPML類,它的屬性不是文本。)

2

我對簡單的xml解析器有相同的需求,經過很長時間花在檢查不同的庫之後,我發現了xmltramp

根據您的示例XML:

import xmltramp 

xml_string = """<root> 
<node value="30">text</node> 
</root>""" 

obj = xmltramp.parse(xml_string) 
print obj.node('value')    # 30 
print str(obj.node)     # text 

我沒有發現任何東西更方便用戶使用。

0

我花了相當一段時間去了解上面提供的例子以及pip上列出的存儲庫。

最簡單的(也是最Python化)的解析XML的,我迄今發現的方式已經XMLToDict - https://github.com/martinblech/xmltodict

從文檔的例子可以在GitHub的上面是複製粘貼以下;它使我的生活變得非常簡單和容易;

>>> doc = xmltodict.parse(""" 
... <mydocument has="an attribute"> 
... <and> 
...  <many>elements</many> 
...  <many>more elements</many> 
... </and> 
... <plus a="complex"> 
...  element as well 
... </plus> 
... </mydocument> 
... """) 
>>> 
>>> doc['mydocument']['@has'] 
u'an attribute' 
>>> doc['mydocument']['and']['many'] 
[u'elements', u'more elements'] 
>>> doc['mydocument']['plus']['@a'] 
u'complex' 
>>> doc['mydocument']['plus']['#text'] 
u'element as well' 

它工作得很好,給了我正在尋找的東西。但是,如果您正在尋找逆向變換,那完全是另一回事。