Python 解析含有命名空間(xmlns)的xml文件(基於ElementTree)


Outline

為什么會有命名空間?

XML的元素名字是不固定的,當兩個不同的文檔,使用同樣的名稱描述兩個不同類型的元素的時候,或者一個同樣的標記表示兩個不同含義的內容的時候,就會發生命名沖突。

這時,命名空間是可以解決這個問題的;

命名空間(Namespace),對於每一套特定應用的DTD,給它一個獨一無二的標志來代表,如果在XML中使用DTD中定義的元素,需將 DTD的標志和元素名,屬性連在一起使用,相當於指明了元素來自什么地方,這樣就不會同其他同名元素混淆了。

命名空間允許我們在一個文檔中結合不同的元素和屬性定義,並指明這些元素和屬性的定義來自那里。
命名空間語法結構:
xmlns:[prefix]=”[url of name]”
其中“xmlns:”是必須的屬性。“prefix”是命名空間的別名,它的值不能為xml。
 <sample xmlns:ins=”http://www.lsmx.net.ac”>
   <ins:batch-list>
   <ins:batch>Evening Batch</ins:batch>
</ins:batch-list>
     </sample>

遇到的問題

在用ElementTree解析xml時,一直很順利,都能解析成功;但突然出現解析不出xml情況,文本編輯器打開xml文檔發現里面是有內容的;
仔細觀察了下發現根標簽中有一個 xmlns 屬性,查了下原來是 命名空間, xml中有命名空間的情況下,獲取子標簽內容的話,就需要通過命名空間去唯一標識這個標簽。

 現在知道xml文件中的xmlns了,剩下就是結合xmlns解析數據了;

debug觀察標簽情況

簡單debug下,看下包含xmlns的標簽是什么樣子的;

 發現包含命名空間的xml,解析時(或者去定位標簽時)標簽的構成是:命名空間+標簽名 

解析數據

通過上面操作已經知道當前xml文本的xmlns是什么了,所以就直接給標簽拼接上xmlns,這樣獲取的內容就都是該命名空間下的內容了。

import xml.etree.ElementTree as ET

path = 'C:\data\美股數據\GenInfo03_NA_i_20200609_1of1.xml\GenInfo_00B6F.xml'
tree = ET.parse(path)
# for i in tree.iter():
#     print(i.tag)
root = tree.getroot()
namespace = '{urn:reuterscompanycontent:generalinformation03}'
iter_root = root.iter(namespace + 'GeneralInformation')  # 直接給標簽拼接上xmlns
ret = []

def get_xml_content(iter_root):
    """遞歸獲取xml標簽內容"""
    for node in iter_root:
        dic = node.attrib
        text = node.text
        if len(dic) == 0 and text == '\n':
            pass
        else:
            dic['text'] = text
            t = node.tag.split('}')[-1]
            ret.append({t: dic})
        get_xml_content(node)


get_xml_content(iter_root)

 參考信息

How does XPath deal with XML namespaces?


免責聲明!

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



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