【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=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

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

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

 

posted @   匡子语  阅读(5470)  评论(1编辑  收藏  举报
编辑推荐:
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
· golang自带的死锁检测并非银弹
· 如何做好软件架构师
· 记录一次线上服务OOM排查
阅读排行:
· 欧阳的2024年终总结,迷茫,重生与失业
· 在 .NET 中使用 Tesseract 识别图片文字
· Bolt.new 30秒做了一个网站,还能自动部署,难道要吊打 Cursor?
· 史上最全的Cursor IDE教程
· 关于产品设计的思考
点击右上角即可分享
微信分享提示