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文件操作类操作实例详解
Jul 11 Python
python实时分析日志的一个小脚本分享
May 07 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
python 自定义异常和异常捕捉的方法
Oct 18 Python
利用python循环创建多个文件的方法
Oct 25 Python
Django 使用easy_thumbnails压缩上传的图片方法
Jul 26 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
Aug 12 Python
python语言线程标准库threading.local解读总结
Nov 10 Python
python数据预处理 :数据抽样解析
Feb 24 Python
Python第三方包PrettyTable安装及用法解析
Jul 08 Python
用Python编写简单的gRPC服务的详细过程
Jul 04 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
DIY实用性框形天线
2021/03/02 无线电
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
PHP-Java-Bridge使用笔记
2014/09/22 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
js实现兼容IE6与IE7的DIV高度
2010/05/13 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
2015/12/02 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
AngularJS 异步解决实现方法
2017/06/12 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
Javascript刷新页面的实例
2017/09/23 Javascript
Vue v2.5 调整和更新不完全问题
2017/10/24 Javascript
js 获取json数组里面数组的长度实例
2017/10/31 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
js tab栏切换代码实例解析
2019/09/03 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
小结Python用fork来创建子进程注意事项
2014/07/03 Python
总结Python编程中函数的使用要点
2016/03/20 Python
Python实现求两个csv文件交集的方法
2017/09/06 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
python程序变成软件的实操方法
2019/06/24 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
简单了解如何封装自己的Python包
2020/07/08 Python
Django-simple-captcha验证码包使用方法详解
2020/11/28 Python
财务副总经理工作职责
2013/11/25 职场文书
2014升学宴答谢词
2014/01/26 职场文书
党员民主评议总结
2014/10/20 职场文书
2014年涉外离婚协议书范本
2014/11/20 职场文书
2014年大学教师工作总结
2014/12/02 职场文书
项目验收申请报告
2015/05/15 职场文书