The ElementTree class
ElementTree主要是作为一个包含根节点的“树(tree)”的文档包裹(document wrapper)。它提供了多个成对的序列化和常规文档处理方法:
>>> root = etree.XML('''\
... <?xml version="1.0"?>
... <!DOCTYPE root SYSTEM "test" [ <!ENTITY tasty "parsnips"> ]>
... <root>
... <a>&tasty;</a>
... </root>
... ''')
>>> tree = etree.ElementTree(root)
>>> print(tree.docinfo.xml_version)
1.0
>>> print(tree.docinfo.doctype)
<!DOCTYPE root SYSTEM "test">
>>> tree.docinfo.public_id = '-//W3C//DTD XHTML 1.0 Transitional//EN'
>>> tree.docinfo.system_url = 'file://local.dtd'
>>> print(tree.docinfo.doctype)
<!DOCTYPE root PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "file://local.dtd">
你调用parse()方法(只需传递参数:文件(files)、或类文件对象(file-like object))所获取的结果也是一个ElementTree。
很重要的一个的不同是,ElementTree是作为一个完整的文档来序列化的。这其中包括processing instructions(处理指令)、comments(注释)、以及DOCTYPE (文档声明)和其他DTD的内容。
>>> print(etree.tostring(tree)) # lxml 1.3.4 and later
<!DOCTYPE root PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "file://local.dtd" [
<!ENTITY tasty "parsnips">
]>
<root>
<a>parsnips</a>
</root>
在最初的xml.etree.ElementTree实现中,直到lxml 1.3.3,当你仅仅序列化根节点元素时,输出看起来是一样的:
>>> print(etree.tostring(tree.getroot()))
<root>
<a>parsnips</a>
</root>
序列化行为在lxml 1.3.4中已经发生了改变。之前,“树”的序列化是不包含DTD内容的,这也使得lxml在输入输出循环中丢失了DTD信息。
从字符或文件中解析(Parsing from strings and files)
lxml.etree支持多种方式解析XML,包括所有重要的数据源,命名字符、文件、URLs(http/ftp)和类文件对象。主要的解析方法是fromstring()和parse(),两者都接受“数据源”作为第一个参数。默认情况下,它使用标准的解析器,但你随时都可以传递一个不同的解析器(作为第二个参数)。
The fromstring() function
fromstring()是从字符串解析的最简单办法:
>>> some_xml_data = "<ro