2010-06-27 62 views
2

我試圖找到在Python XML的解析函數(如simplexml_load_string),但沒有成功:/simplexml_load_string等價的Python/Django的

比方說,我有XML字符串中的

my_xml_string = """ 
<root> 
     <content> 
     <one>A value</one> 
     <two>Here goes for ...</two> 
     </content> 
</root>""" 

要閱讀在PHP中值我normaly做這樣的事情

// read into object 
$xml = simplexml_load_string(my_xml_string); 

// print some values 
echo $xml->root->content->one 
echo $xml->root->content->two 

有沒有在Python/Django的任何等價的對象?

由於

回答

0

從xml.dom.minidom進口*

my_xml_string = """ 
<root> 
     <content> 
     <one>A value</one> 
     <two>Here goes for ...</two> 
     </content> 
</root>""" 

xml = parseString(xml_string) 
result = xml.getElementsByTagName('one')[0].firstChild.data 

這並獲得成功,現在!

4

最近的可能是ElementTree它是Python標準庫的一部分(或擴展版本lxml

import xml.etree 

element = xml.etree.ElementTree.XML(my_xml_string) 

設置元件,其是類元素的,這可以被視爲XML元素列表

例如

# for your example 
print(element[0][0].tag) 
print(element[0][0].text) 
print(element[0][3].text) 

如果您想使用名稱,還可以按XPath進行搜索。

lxml也有一個objectify模型,允許訪問元素爲「如果您正在處理普通的Python對象層次結構」。它與php的使用更精確匹配

+0

嗯怎麼樣xml.dom.minidom什麼? – 2010-06-27 20:18:47

+0

你可以使用它 - 但你然後操縱一個DOM - lxml和元素樹試圖使navifaction更'pythonic'不DOM特定 – Mark 2010-06-27 20:31:06

1

Python standard library包含幾個xml解析模塊。最簡單的可能是ElementTree。

from xml.etree import cElementTree as ET 
xml = ET.fromstring(my_xml_string) 

print xml.find('.//content/one').text 
print xml.find('.//content/two').text 
1

ElementTree是相當常見的,可能是Python中包含的最好的庫(從版本2.5開始)。

但是,我個人更喜歡lxml的功能和靈活性。 「lxml.objectify」方法對於將大型XML DOM解析爲pythonic對象特別有用。

+0

我不真的很喜歡ElementTree,也許我有點不習慣的語法。 xml.dom.minidom對我來說似乎更完整。我一定會考慮lxml!謝謝! – 2010-06-27 20:17:50

+1

minidom是最簡單的,但也是*最少* pythonic和最少功能完成。我已經使用它來完成以前完成的工作,但是如果你花很多時間處理XML,你很快就會放棄它。 – 2010-06-27 23:27:21

2

lxml.objectify不正是你想要

In [1]: from lxml import objectify 

In [2]: x = objectify.fromstring("""<response><version>1.2</version><amount>1.01</amount><currency>USD</currency></response>""") 

In [3]: x.version 
Out[3]: 1.2 

In [4]: x.amount 
Out[4]: 1.01 

In [5]: x.currency 
Out[5]: 'USD'