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'