【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

可以看到,獲取屬性時,不需要加命名空間,直接獲取即可

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM