您的位置:首页 > 编程语言 > Python开发

【python】lxml处理命名空间

2016-10-12 18:26 344 查看
有如下xml

<A xmlns="http://This/is/a/namespace">
<B>dataB1</B>
<B>dataB2</B>
<B>
<C>dataC</C>
</B>
</A>


其中的xmlns属性表示的是该xml的默认命名空间,该命名空间必须是一个url形式

查看xml的tag

#encoding=utf8

from lxml import etree

str_xml = """
<A xmlns="http://This/is/a/namespace"> <B>dataB1</B> <B>dataB2</B> <B> <C>dataC</C> </B> </A>
"""

xml = etree.fromstring(str_xml)
for node in xml.iter():
print node.tag


结果为:

{http://This/is/a/namespace}A
{http://This/is/a/namespace}B
{http://This/is/a/namespace}B
{http://This/is/a/namespace}B
{http://This/is/a/namespace}C


可以看到,跟普通xml的tag相比每个tag前面都多出了一个命名空间

获取命名空间 .nsmap

from lxml import etree

str_xml = """
<A xmlns="http://This/is/a/namespace"> <B>dataB1</B> <B>dataB2</B> <B> <C>dataC</C> </B> </A>
"""

xml = etree.fromstring(str_xml)
ns = xml.nsmap
print ns
print ns[None]


结果

{None: 'http://This/is/a/namespace'} http://This/is/a/namespace[/code] 
ns[None]获取的是默认命名空间,ns会显示所有的命名空间

获取有命名空间的节点内容

from lxml import etree

str_xml = """
<A xmlns="http://This/is/a/namespace"> <B>dataB1</B> <B>dataB2</B> <B> <C>dataC</C> </B> </A>
"""

xml = etree.fromstring(str_xml)
ns = xml.nsmap[None]
ns = "{%s}" % ns
for item in xml.findall("{0}B/{0}C".format(ns)): #不能用xpath会出错
print item.text


结果

dataC


注意,在查找节点时,每一级节点都需要加上命名空间。而且测试时发现,findall可以正常查找到信息,而xpath会报错。

获取带命名空间节点的属性值

from lxml import etree

str_xml = """
<A xmlns="http://This/is/a/namespace">
<B b="123">dataB1</B>
<B>dataB2</B>
<B>
<C>dataC</C>
</B>
</A>
"""

xml = etree.fromstring(str_xml)
ns = xml.nsmap[None]
ns = "{%s}" % ns

item = xml.find(ns+"B")
print item.get("b")
print item.text


结果

123
dataB1


可以看到,获取属性时,不需要加命名空间,直接获取即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: