首页 > 代码库 > 【python】lxml处理命名空间

【python】lxml处理命名空间

有如下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=utf8from lxml import etreestr_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 etreestr_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.nsmapprint nsprint ns[None]

结果

{None: ‘http://This/is/a/namespace‘}http://This/is/a/namespace

ns[None]获取的是默认命名空间,ns会显示所有的命名空间

 

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

from lxml import etreestr_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}" % nsfor item in xml.findall("{0}B/{0}C".format(ns)): #不能用xpath会出错    print item.text

结果

dataC

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

 

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

from lxml import etreestr_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}" % nsitem = xml.find(ns+"B")print item.get("b")print item.text

结果

123dataB1

可以看到,获取属性时,不需要加命名空间,直接获取即可

 

【python】lxml处理命名空间