XML的命名空間與python解析方法

在 XML 中,元素名稱是由開發者定義的,當兩個不同的文檔使用相同的元素名時,就會發生命名衝突,而XML 命名空間提供避免元素命名衝突的方法。

XML 命名空間屬性被放置於元素的開始標籤之中,並使用以下的語法:
xmlns:namespace-prefix="namespaceURI"
當命名空間被定義在元素的開始標籤中時,所有帶有相同前綴的子元素都會與同一個命名空間相關聯。
註釋:用於標示命名空間的地址不會被解析器用於查找信息。其惟一的作用是賦予命名空間一個惟一的名稱。

除了顯式定義,爲元素定義默認的命名空間可以讓我們省去在所有的子元素中使用前綴的工作。也就是說所有沒有前綴的標籤都會帶有默認的命名空間
請使用下面的語法:
xmlns="namespaceURI"

解析帶有命名空間的XML文件時,要注意標籤的名字是命名空間與標籤的結合,比如下面的XML文件:

<?xml version='1.0' encoding='UTF-8'?>
<nvd xmlns:vuln="http://bulabula" xmlns:cvss="http://abulaabula" xmlns="http://alulalula">
  <entry id="CVE-2011-0001">
     <vuln:cvss>
      <cvss:base_metrics>
        <cvss:score>5.0</cvss:score>
      </cvss:base_metrics>
    </vuln:cvss>
  </entry>
</nvd>

其中默認的命名空間爲xmls,另外聲明瞭兩個命名空間xmlns:vuln和xmlns:cvss。如果使用python的ElementTree解析,下面的代碼是錯誤的

node.find('score').text
運行的時候會報錯,如下:
AttributeError: 'NoneType' object has no attribute 'text'
也就是說,node.find('score')沒有找到任何結果。

正確的訪問方式應該是這樣的,也就是加上命名空間:

cvss = “{http://abulabula}”
node.find(cvss + 'score')
對於例子中的entry這種沒有顯式前綴的標籤,他們是帶有隱式前綴xmlns的,所以訪問時要加上xmlns的值


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章