Python利用命名空间解析XML文档


Posted in Python onAugust 10, 2020

问题

你想解析某个XML文档,文档中使用了XML命名空间。

解决方案

考虑下面这个使用了命名空间的文档:

<?xml version="1.0" encoding="utf-8"?>
<top>
  <author>David Beazley</author>
  <content>
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <title>Hello World</title>
      </head>
      <body>
        <h1>Hello World!</h1>
      </body>
    </html>
  </content>
</top>

如果你解析这个文档并执行普通的查询,你会发现这个并不是那么容易,因为所有步骤都变得相当的繁琐。

>>> # Some queries that work
>>> doc.findtext('author')
'David Beazley'
>>> doc.find('content')
<Element 'content' at 0x100776ec0>
>>> # A query involving a namespace (doesn't work)
>>> doc.find('content/html')
>>> # Works if fully qualified
>>> doc.find('content/{http://www.w3.org/1999/xhtml}html')
<Element '{http://www.w3.org/1999/xhtml}html' at 0x1007767e0>
>>> # Doesn't work
>>> doc.findtext('content/{http://www.w3.org/1999/xhtml}html/head/title')
>>> # Fully qualified
>>> doc.findtext('content/{http://www.w3.org/1999/xhtml}html/'
... '{http://www.w3.org/1999/xhtml}head/{http://www.w3.org/1999/xhtml}title')
'Hello World'
>>>

你可以通过将命名空间处理逻辑包装为一个工具类来简化这个过程:

class XMLNamespaces:
  def __init__(self, **kwargs):
    self.namespaces = {}
    for name, uri in kwargs.items():
      self.register(name, uri)
  def register(self, name, uri):
    self.namespaces[name] = '{'+uri+'}'
  def __call__(self, path):
    return path.format_map(self.namespaces)

通过下面的方式使用这个类:

>>> ns = XMLNamespaces(html='http://www.w3.org/1999/xhtml')
>>> doc.find(ns('content/{html}html'))
<Element '{http://www.w3.org/1999/xhtml}html' at 0x1007767e0>
>>> doc.findtext(ns('content/{html}html/{html}head/{html}title'))
'Hello World'
>>>

讨论

解析含有命名空间的XML文档会比较繁琐。 上面的 XMLNamespaces 仅仅是允许你使用缩略名代替完整的URI将其变得稍微简洁一点。

很不幸的是,在基本的 ElementTree 解析中没有任何途径获取命名空间的信息。 但是,如果你使用 iterparse() 函数的话就可以获取更多关于命名空间处理范围的信息。例如:

>>> from xml.etree.ElementTree import iterparse
>>> for evt, elem in iterparse('ns2.xml', ('end', 'start-ns', 'end-ns')):
... print(evt, elem)
...
end <Element 'author' at 0x10110de10>
start-ns ('', 'http://www.w3.org/1999/xhtml')
end <Element '{http://www.w3.org/1999/xhtml}title' at 0x1011131b0>
end <Element '{http://www.w3.org/1999/xhtml}head' at 0x1011130a8>
end <Element '{http://www.w3.org/1999/xhtml}h1' at 0x101113310>
end <Element '{http://www.w3.org/1999/xhtml}body' at 0x101113260>
end <Element '{http://www.w3.org/1999/xhtml}html' at 0x10110df70>
end-ns None
end <Element 'content' at 0x10110de68>
end <Element 'top' at 0x10110dd60>
>>> elem # This is the topmost element
<Element 'top' at 0x10110dd60>
>>>

最后一点,如果你要处理的XML文本除了要使用到其他高级XML特性外,还要使用到命名空间, 建议你最好是使用 lxml 函数库来代替 ElementTree 。 例如,lxml 对利用DTD验证文档、更好的XPath支持和一些其他高级XML特性等都提供了更好的支持。 这一小节其实只是教你如何让XML解析稍微简单一点。

以上就是Python利用命名空间解析XML文档的详细内容,更多关于Python命名空间解析XML文档的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python脚本实现查找webshell的方法
Jul 31 Python
python删除特定文件的方法
Jul 30 Python
详解Python中的相对导入和绝对导入
Jan 06 Python
Python基于回溯法子集树模板解决找零问题示例
Sep 11 Python
python中实现数组和列表读取一列的方法
Apr 03 Python
python实现自动登录后台管理系统
Oct 18 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 Python
django2笔记之路由path语法的实现
Jul 17 Python
基于pytorch的lstm参数使用详解
Jan 14 Python
keras的ImageDataGenerator和flow()的用法说明
Jul 03 Python
opencv读取视频并保存图像的方法
Jun 04 Python
Python 可迭代对象 iterable的具体使用
Aug 07 Python
Python如何定义有默认参数的函数
Aug 10 #Python
如何更换python默认编辑器的背景色
Aug 10 #Python
django前端页面下拉选择框默认值设置方式
Aug 09 #Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 #Python
django 获取字段最大值,最新的记录操作
Aug 09 #Python
在django中查询获取数据,get, filter,all(),values()操作
Aug 09 #Python
Python 使用双重循环打印图形菱形操作
Aug 09 #Python
You might like
在Zeus Web Server中安装PHP语言支持
2006/10/09 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
filemanage功能中用到的lib.js
2007/04/08 Javascript
JavaScript Event学习第六章 事件的访问
2010/02/07 Javascript
jQuery代码优化 选择符篇
2011/11/01 Javascript
javascript测试题练习代码
2012/10/10 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
关于textarea提交的内容无法换行的解决办法
2013/04/09 Javascript
javascript获取元素偏移量的方法有哪些
2014/06/24 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
2016/01/12 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
Rollup处理并打包JS文件项目实例代码
2018/05/31 Javascript
vue添加axios,并且指定baseurl的方法
2018/09/19 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
ES6基础之数组和对象的拓展实例详解
2019/08/22 Javascript
Python深入学习之闭包
2014/08/31 Python
python生成验证码图片代码分享
2016/01/28 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
2015/09/11 面试题
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
中专生自荐信
2013/10/12 职场文书
批评与自我批评材料
2014/02/15 职场文书
大学生求职计划书
2014/04/30 职场文书
参赛口号
2014/06/16 职场文书
金融专业求职信
2014/08/05 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
平遥古城导游词
2015/02/03 职场文书
责任书范本大全
2015/05/11 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
八年级作文之感恩
2019/11/22 职场文书
python 标准库原理与用法详解之os.path篇
2021/10/24 Python