Python 用ElementTree解析嵌套XML
我有以下XML格式,我想使用python的XML.etree.ElementTree模块提取名称、区域和状态的值 然而,到目前为止,我试图获取这些信息的尝试没有成功Python 用ElementTree解析嵌套XML,python,xml,xml-parsing,elementtree,Python,Xml,Xml Parsing,Elementtree,我有以下XML格式,我想使用python的XML.etree.ElementTree模块提取名称、区域和状态的值 然而,到目前为止,我试图获取这些信息的尝试没有成功 <feed> <entry> <id>uuid:asdfadsfasdf123123</id> <title type="text"></title> <content type="applicati
<feed>
<entry>
<id>uuid:asdfadsfasdf123123</id>
<title type="text"></title>
<content type="application/xml">
<NamespaceDescription xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Name>instancename</Name>
<Region>US</Region>
<Status>Active</Status>
</NamespaceDescription>
</content>
</entry>
<entry>
<id>uuid:asdfadsfasdf234234</id>
<title type="text"></title>
<content type="application/xml">
<NamespaceDescription xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Name>instancename2</Name>
<Region>US2</Region>
<Status>Active</Status>
</NamespaceDescription>
</content>
</entry>
</feed>
tag为我提供了想要访问的节点,但name没有返回任何节点。知道我的代码有什么问题吗
desc.tag的输出:
{http://schemas.microsoft.com/netservices/2010/10/servicebus/connect}Name
{http://schemas.microsoft.com/netservices/2010/10/servicebus/connect}Region
{http://schemas.microsoft.com/netservices/2010/10/servicebus/connect}Status
您可以使用
lxml.etree
和默认名称空间映射来解析XML,如下所示:
content = '''
<feed>
<entry>
<id>uuid:asdfadsfasdf123123</id>
<title type="text"></title>
<content type="application/xml">
<NamespaceDescription xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Name>instancename</Name>
<Region>US</Region>
<Status>Active</Status>
</NamespaceDescription>
</content>
</entry>
<entry>
<id>uuid:asdfadsfasdf234234</id>
<title type="text"></title>
<content type="application/xml">
<NamespaceDescription xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Name>instancename2</Name>
<Region>US2</Region>
<Status>Active</Status>
</NamespaceDescription>
</content>
</entry>
</feed>'''
from lxml import etree
tree = etree.XML(content)
ns = {'default': 'http://schemas.microsoft.com/netservices/2010/10/servicebus/connect'}
names = tree.xpath('//default:Name/text()', namespaces=ns)
regions = tree.xpath('//default:Region/text()', namespaces=ns)
statuses = tree.xpath('//default:Status/text()', namespaces=ns)
print(names)
print(regions)
print(statuses)
这个XPath/名称空间功能可以调整为以您需要的任何格式输出数据。我不知道为什么我以前没有看到这个。但是,我能够得到这些值
root = et.fromstring(XML_STRING)
entry_root = root.findall('{0}entry'.format(NAMESPACE))
for child in entry_root:
content_node = child.find('{0}content'.format(NAMESPACE))
for descr in content_node:
name_node = descr.find('{0}Name'.format(NAMESPACE))
print name_node.text
谢谢你的回复。我应该提到我只限于'xml.etree.ElementTree'好的-我会看看我能做些什么。同时,看看是否可以安装
lxml
——它是Python
的最佳XML
解析模块。从您的命令行运行pip install lxml
进行安装。如果xml
文件已经在您的电脑上,而不必下载它们,您如何执行此操作?
['instancename', 'instancename2']
['US', 'US2']
['Active', 'Active']
root = et.fromstring(XML_STRING)
entry_root = root.findall('{0}entry'.format(NAMESPACE))
for child in entry_root:
content_node = child.find('{0}content'.format(NAMESPACE))
for descr in content_node:
name_node = descr.find('{0}Name'.format(NAMESPACE))
print name_node.text