这是一个关于使用lxml.etree进行XML处理的教程。它简要概述了ElementTree API的主要概念,以及一些简单的增强功能,使您作为程序员的生活更轻松。
关注小编后续次序更新
本文章主要介绍的是,ElementTree类
从字符串和文件中解析
fromstring()函数
XML()函数
parse()函数
解析器对象
增量解析
ElementTree类
一个ElementTree的主要文档包裹一个树根节点。它提供了两种序列化和一般文档处理方法。
root = etree 。XML (’’’ \
… <?xml version =“1.0”?>
… <!DOCTYPE root SYSTEM“test”[<!ENTITY tasty“parsnips”>]>
…
… &tasty;
… </ root>
… ‘’’’ )tree = etree 。ElementTree的(根)
打印(树。DOCINFO 。xml_version )
1.0打印(树。DOCINFO 。DOCTYPE )
<!DOCTYPE根SYSTEM “测试”>树。docinfo 。public_id = ’ - // W3C // DTD XHTML 1.0 Transitional // EN’
树。docinfo 。system_url = ‘文件://local.dtd’
打印(树。DOCINFO 。DOCTYPE )
<DOCTYPE根PUBLIC “ - // W3C // DTD XHTML 1.0过渡// EN”“文件://local.dtd “>
一个ElementTree的也是你得到什么,当你调用 解析()函数来解析文件或类似文件的对象(见下面的分析部)。
其中一个重要区别是ElementTree类序列化为完整文档,而不是单个元素。这包括顶级处理说明和注释,以及文档中的DOCTYPE和其他DTD内容:
打印(etree 。的toString (树)) #LXML 1.3.4和后
<!DOCTYPE根PUBLIC “ - // W3C // DTD XHTML 1.0过渡// EN” “文件://local.dtd”[
< !ENTITY美味的“parsnips”>
]>
parsnips
</ root>
在原始的xml.etree.ElementTree实现中,在lxml中最高为1.3.3,输出看起来与仅序列化根元素时的输出相同:
打印(etree 。的toString (树。getroot ()))
<根>
防风草
</根>
此序列化行为在lxml 1.3.4中已更改。之前,树被序列化而没有DTD内容,这使得lxml在输入 - 输出周期中丢失了DTD信息。
从字符串和文件中解析
lxml.etree支持以多种方式从所有重要来源解析XML,即字符串,文件,URL(http / ftp)和类文件对象。主要的解析函数是fromstring()和 parse(),它们都以source作为第一个参数调用。默认情况下,它们使用标准解析器,但您始终可以将不同的解析器作为第二个参数传递。
fromstring()函数
该fromstring()函数解析字符串的最简单的方法:
some_xml_data = “ data </ root>”
root = etree 。fromstring (some_xml_data )
打印(根。标签)
根etree 。tostring (root )
b’ data </ root>’
XML()函数
的XML()函数的行为类似于fromstring()函数,但常用于XML文本写右到源:
root = etree 。XML (“<根>数据</根>” )
打印(根。标签)
根etree 。tostring