Python 中人类的 XML
项目描述
xml4h是 MIT 许可的 Python 库,可以更轻松地使用 XML。
这个库的存在是因为 Python 很棒,XML 无处不在,将两者结合起来应该是一种乐趣,但通常并非如此。使用xml4h,这很容易。
从版本 1.0开始, xml4h支持 Python 版本 2.7 和 3.5+。
特征
xml4h是现有 Python XML 处理库(如lxml、ElementTree和minidom )的简化层。它提供:
用于遍历和操作 XML DOM 的丰富 Pythonic API。
一个文档构建器,可以用最少的代码简单安全地构建复杂的文档。
一种以您期望的结构和格式对 XML 文档进行序列化的编写器,这与您倾向于从其他库获得的机器但不是对人类友好的输出不同。
除了漂亮的 API 和工具集之外,xml4h抽象层还提供了一些其他好处:
不同底层 XML 库的通用接口,因此如果您切换实现,则无需重写针对xml4h编写的代码。
您可以轻松地在xml4h和底层实现之间移动:使用最快的实现解析文档,使用xml4h使用人性化代码操作 DOM ,然后在需要时返回底层实现。
安装
使用 pip安装xml4h:
$ pip install xml4h
或者手动安装 tarball:
$ python setup.py install
链接
GitHub 源代码和问题:https ://github.com/jmurty/xml4h
ReadTheDocs 文档:https ://xml4h.readthedocs.org
从 Python 包索引安装:https ://pypi.python.org/pypi/xml4h
介绍
使用xml4h,您可以轻松解析 XML 文件并访问它们的数据。
让我们从一个示例 XML 文档开始:
$ cat tests/data/monty_python_films.xml
<MontyPythonFilms source="http://en.wikipedia.org/wiki/Monty_Python">
<Film year="1971">
<Title>And Now for Something Completely Different</Title>
<Description>
A collection of sketches from the first and second TV series of
Monty Python's Flying Circus purposely re-enacted and shot for film.
</Description>
</Film>
<Film year="1974">
<Title>Monty Python and the Holy Grail</Title>
<Description>
King Arthur and his knights embark on a low-budget search for
the Holy Grail, encountering humorous obstacles along the way.
Some of these turned into standalone sketches.
</Description>
</Film>
<Film year="1979">
<Title>Monty Python's Life of Brian</Title>
<Description>
Brian is born on the first Christmas, in the stable next to
Jesus'. He spends his life being mistaken for a messiah.
</Description>
</Film>
<... more Film elements here ...>
</MontyPythonFilms>
使用xml4h,您可以解析 XML 文件并使用“神奇”的元素和属性查找来读取数据:
>>> import xml4h
>>> doc = xml4h.parse('tests/data/monty_python_films.xml')
>>> for film in doc.MontyPythonFilms.Film[:3]:
... print(film['year'] + ' : ' + film.Title.text)
1971 : And Now for Something Completely Different
1974 : Monty Python and the Holy Grail
1979 : Monty Python's Life of Brian
您还可以使用更显式(非魔法)的方法来遍历 DOM:
>>> for film in doc.child('MontyPythonFilms').children('Film')[:3]:
... print(film.attributes['year'] + ' : ' + film.children.first.text)
1971 : And Now for Something Completely Different
1974 : Monty Python and the Holy Grail
1979 : Monty Python's Life of Brian
xml4h构建器使程序化文档创建变得简单,它具有方法链接功能,允许反映文档本身的富有表现力但稀疏的代码。以下是构建上述 XML 文档的一部分的代码:
>>> b = (xml4h.build('MontyPythonFilms')
... .attributes({'source': 'http://en.wikipedia.org/wiki/Monty_Python'})
... .element('Film')
... .attributes({'year': 1971})
... .element('Title')
... .text('And Now for Something Completely Different')
... .up()
... .elem('Description').t(
... "A collection of sketches from the first and second TV"
... " series of Monty Python's Flying Circus purposely"
... " re-enacted and shot for film."
... ).up()
... .up()
... )
>>> # A builder object can be re-used, and has short method aliases
>>> b = (b.e('Film')
... .attrs(year=1974)
... .e('Title').t('Monty Python and the Holy Grail').up()
... .e('Description').t(
... "King Arthur and his knights embark on a low-budget search"
... " for the Holy Grail, encountering humorous obstacles along"
... " the way. Some of these turned into standalone sketches."
... ).up()
... .up()
... )
使用xml4h的编写器实现漂亮地打印您的 XML 文档,其中包含将内容写入流或以具有灵活格式选项的文本形式获取内容的方法:
>>> print(b.xml_doc(indent=4, newline=True)) # doctest: +ELLIPSIS
<?xml version="1.0" encoding="utf-8"?>
<MontyPythonFilms source="http://en.wikipedia.org/wiki/Monty_Python">
<Film year="1971">
<Title>And Now for Something Completely Different</Title>
<Description>A collection of sketches from ...</Description>
</Film>
<Film year="1974">
<Title>Monty Python and the Holy Grail</Title>
<Description>King Arthur and his knights embark ...</Description>
</Film>
</MontyPythonFilms>
<BLANKLINE>
为什么使用xml4h?
Python 有三个用于处理 XML 的流行库,但没有一个特别好用:
xml.dom.minidom 是标准库中包含的 W3C DOM 的轻量级、中等功能的实现。不幸的是,W3C DOM API 冗长、笨拙,而且不是很 Python,而且minidom不支持 XPath 表达式。
xml.etree.ElementTree 是一个快速的分层数据容器,包含在标准库中,主要用于表示 XML。该 API 相当 Python 并且支持一些基本的 XPath 特性,但它缺少一些您可能期望的 DOM 遍历细节(例如,获取元素的父元素),并且在使用它时,您经常觉得您使用的东西与 XML 略有不同,因为您是.
lxml是一个快速、功能齐全的 XML 库,其 API 基于 ElementTree 并进行了扩展。它是您在 Python 中认真处理 XML 的最佳选择,但它不包含在标准库中,可能难以安装,并且它给您与 ElementTree 前辈一样的它的 XML 但不完全的感觉.
鉴于这三个选项,可能很难选择使用哪个库,特别是如果您是 Python 中的 XML 处理新手并且还没有使用(苦苦挣扎)其中任何一个。
在过去,最好的选择是使用lxml以获得最大的灵活性,即使它可能有点过头了,因为至少如果以后发现需要 XPath 支持或强大的 DOM 遍历,您就不必重写代码方法。
这就是xml4h的用武之地。它在现有 XML 库之上提供了一个抽象层,在提供改进的 API 和工具集的同时利用它们的强大功能。
开发状态:测试版
目前xml4h包括三个主要的 XML 处理 Python 库的适配器实现。
如果您有可用的lxml(强烈推荐),它将使用它,否则它将回退到使用(c)ElementTree,然后是minidom库。
历史
1.0
添加对 Python 3 (3.5+) 的支持
放弃对 2.7 之前的 Python 版本的支持。
修复 lxml 适配器的节点命名空间前缀值。
改进构建器的up()方法以接受和区分要升级的父级计数或目标祖先节点的名称。
将xml()和xml_doc()方法添加到文档构建器,以便更轻松地从中获取字符串内容,而无需使用 write 方法。
默认情况下,write()和write_doc()方法不再将输出发送到 sys.stdout。用户必须显式提供目标写入器对象,并希望在提供文本流对象时更加注意正确设置编码的需要。
冗余元素命名空间前缀的处理现在更加一致:当元素具有定义相同命名空间 URI的xmlns属性时,我们总是去除前缀。
0.2.0
为Python 2.7+ 标准包含的(c)ElementTree库版本添加适配器。
改进了“神奇”节点遍历以使用小写标记名称,而无需始终使用尾随下划线。另请参阅改进的文档。
修复:潜在错误 ASCII 编码节点为字符串;来自文档节点的默认 XPath 命名空间;xmlns 属性的查找优先级。
0.1.0
初始 alpha 版本,支持lxml和minidom库。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。