微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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的值

原文地址:https://www.jb51.cc/xml/297579.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。