【python】lxml處理命名空間

有以下xmlnode

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

其中的xmlns屬性表示的是該xml的默認命名空間,該命名空間必須是一個url形式測試

查看xml的tagurl

#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

結果爲:spa

{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前面都多出了一個命名空間code

 

獲取命名空間  .nsmaporm

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]

結果xml

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

ns[None]獲取的是默認命名空間,ns會顯示全部的命名空間blog

 

獲取有命名空間的節點內容get

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

結果string

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

能夠看到,獲取屬性時,不須要加命名空間,直接獲取便可

相關文章
相關標籤/搜索