《Python Cookbook(第3版)中文版》——6.6 解析、修改和重写XML

    xiaoxiao2024-10-08  95

    本节书摘来自异步社区《Python Cookbook(第3版)中文版》一书中的第6章,第6.6节,作者[美]David Beazley , Brian K.Jones,陈舸 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    6.6 解析、修改和重写XML

    6.6.1 问题

    我们想读取一个XML文档,对它做些修改后再以XML的方式写回。

    6.6.2 解决方案

    xml.etree.ElementTree模块可以轻松完成这样的任务。从本质上来说,开始时可以按照通常的方式来解析文档。例如,假设有一个名为pred.xml的文档,它看起来是这样的:

    <?xml version="1.0"?> <stop> <id>14791</id> <nm>Clark & Balmoral</nm> <sri> <rt>22</rt> <d>North Bound</d> <dd>North Bound</dd> </sri> <cr>22</cr> <pre> <pt>5 MIN</pt> <fd>Howard</fd> <v>1378</v> <rn>22</rn> </pre> <pre> <pt>15 MIN</pt> <fd>Howard</fd> <v>1867</v> <rn>22</rn> </pre> </stop>

    下面的示例采用ElementTree来读取这个文档,并对文档的结构作出修改:

    >>> from xml.etree.ElementTree import parse, Element >>> doc = parse('pred.xml') >>> root = doc.getroot() >>> root <Element 'stop' at 0x100770cb0> >>> # Remove a few elements >>> root.remove(root.find('sri')) >>> root.remove(root.find('cr')) >>> # Insert a new element after <nm>...</nm> >>> root.getchildren().index(root.find('nm')) 1 >>> e = Element('spam') >>> e.text = 'This is a test' >>> root.insert(2, e) >>> # Write back to a file >>> doc.write('newpred.xml', xml_declaration=True) >>>

    这些操作的结果产生了一个新的XML文档,看起来是这样的:

    <?xml version='1.0' encoding='us-ascii'?> <stop> <id>14791</id> <nm>Clark & Balmoral</nm> <spam>This is a test</spam><pre> <pt>5 MIN</pt> <fd>Howard</fd> <v>1378</v> <rn>22</rn> </pre> <pre> <pt>15 MIN</pt> <fd>Howard</fd> <v>1867</v> <rn>22</rn> </pre> </stop>

    6.6.3 讨论

    修改XML文档的结构是简单直接的,但是必须记住所有的修改主要是对父元素进行的,我们把它当做是一个列表一样对待。比如说,如果移除某个元素,那么就利用它的直接父节点的remove()方法完成。如果插入或添加新的元素,同样要使用父节点的insert()和append()方法来完成。这些元素也可以使用索引和切片操作来进行操控,比如element[i]或者是element[i:j]。

    如果需要创建新的元素,可以使用Element类来完成,我们本节给出的示例中已经这么做了。这在6.5节中有更进一步的描述。

    相关资源:python cookbook(第3版)高清中文完整版.pdf
    最新回复(0)