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开发环境搭建
Dec 16 Python
PyQt 线程类 QThread使用详解
Jul 16 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
python使用正则表达式来获取文件名的前缀方法
Oct 21 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
Jan 23 Python
Python编写带选项的命令行程序方法
Aug 13 Python
详解使用django-mama-cas快速搭建CAS服务的实现
Oct 30 Python
python3操作注册表的方法(Url protocol)
Feb 05 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
Apr 16 Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 20 Python
Python 多进程、多线程效率对比
Nov 19 Python
Python环境配置实现pip加速过程解析
Nov 27 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书写格式详解(必看)
2016/05/23 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
2019/01/28 PHP
动态添加js事件实现代码
2009/03/12 Javascript
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版)
2016/11/30 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
2017/03/04 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
2017/03/29 Javascript
浅谈vue的踩坑路
2017/08/31 Javascript
layui 表单标签的校验方法
2019/09/04 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
python dataframe astype 字段类型转换方法
2018/04/11 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
Python使用20行代码实现微信聊天机器人
2020/06/05 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
2020/09/20 Python
基于PyTorch中view的用法说明
2021/03/03 Python
萌新HTML5 入门指南(二)
2020/11/09 HTML / CSS
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
椰子猫砂:CatSpot
2018/08/27 全球购物
Swanson中国官网:美国斯旺森健康产品公司
2021/03/01 全球购物
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
前台领班岗位职责
2013/12/04 职场文书
法学个人求职信范文
2014/01/27 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
试用期转正工作总结2015
2015/05/28 职场文书
《青山不老》教学反思
2016/02/22 职场文书
导游词之南京中山陵
2019/11/27 职场文书
pytorch 如何把图像数据集进行划分成train,test和val
2021/05/31 Python