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 调用DLL操作抄表机
Jan 12 Python
Python生成随机密码
Mar 10 Python
简单的Python2.7编程初学经验总结
Apr 01 Python
Python中标准库OS的常用方法总结大全
Jul 19 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 Python
python匿名函数用法实例分析
Aug 03 Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 Python
使用keras实现densenet和Xception的模型融合
May 23 Python
Jupyter Notebook 远程访问配置详解
Jan 11 Python
python 制作网站小说下载器
Feb 20 Python
一起来学习Python的元组和列表
Mar 13 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
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
php微信开发之带参数二维码的使用
2016/08/03 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
javascript引导程序
2008/10/26 Javascript
IE关闭时判断及AJAX注销案例学习
2013/02/18 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
jQuery.position()方法获取不到值的安全替换方法
2015/03/13 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
vuex进阶知识点巩固
2018/05/20 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
解决layui的使用以及针对select、radio等表单组件不显示的问题
2019/09/05 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[01:04:20]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.29
2020/12/02 DOTA
介绍Python中内置的itertools模块
2015/04/29 Python
python实现同时给多个变量赋值的方法
2015/04/30 Python
python多线程抽象编程模型详解
2019/03/20 Python
24式加速你的Python(小结)
2019/06/13 Python
Python中的self用法详解
2019/08/06 Python
Scrapy框架实现的登录网站操作示例
2020/02/06 Python
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
文秘求职信范文
2014/04/10 职场文书
房屋租赁协议书(标准版)
2014/10/02 职场文书
2014年社区卫生工作总结
2014/12/18 职场文书
教师节大会主持词
2015/07/06 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP