记录下方法,省得下次再找。目前只有Python的版本。

XML

来自xml.etree.ElementTree — The ElementTree XML API的XML示例:

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

Python解析XML

参考xml.etree.ElementTree — The ElementTree XML API.

首先要明白一些术语。

在整个xml文件里,一般由一个大括号包起来,如上面的例子,就是<data>标签,这个总括全部信息的节点就是 root 节点。

其次,<country name="Liechtenstein"> 中,元素的tag就是标签的名字,即括号里打头的字符串,也就是country. 而name=xxx这个被称为attribute,也就是属性。<data>标签下有三个<country>标签,这些<country>标签被称为<data>的孩子节点, children

<rank>1</rank>, 标签<rank>间有文字1, 它没有被包含在尖括号<>中,所以不是孩子节点,而是被称为 text 节点。可能为空,或者一些空白符(如回车、空格等),或者看到的字符串。

介绍用xml.etree.ElementTree模块来处理(同样有个对应的cElementTree)XML。

首先简记xml.etree.ElementTreeET.

一般用ET.parse方法来将一个文本转换为element tree对象, 记为tree。经过测试,这个函数应该会把整个XML文本给读到内存里!再加上数据结构的信息,内存开销会比整个XML文本的大小还庞大很多。(没有专门测过,只是看了下加载后的内存,一个130M的文本,加载进来后Python内存占据为500+M)

然后用tree.getroot()来得到root节点。

ET中所有节点都是用Element元素,其包含一些属性和方法,以下是说明:

  1. tag

    就是当前元素的标签,如<data>元素就是data

  2. text, tail

    就是元素中的字符串。其中text存的是当前标签开始到第一个孩子元素间的字符串,如果没有孩子元素,那就是被整个标签包围的字符串了,如上面说的<rank>1</rank>中的1。tail则是当前标签后面的字符串了!注意,这是标签包起来的外部的后面。

    官网的示例很清楚了:

     <a><b>1<c>2<d/>3</c></b>4</a>
    

    the a element has None for both text and tail attributes, the b element has text “1” and tail “4”, the c element has text “2” and tail None, and the d element has text None and tail “3”.

  3. attrib

    标签的属性,一个 key-value 字典

  4. items(), keys(), get()

    返回的是属性字典的信息(都是字典的方法)。

  5. find(), findall(), iterfind()

    用来寻找子元素(孩子节点)的方法。传入的是标签名或者path

  6. findtext()

    返回的是匹配到的第一个子元素的文本!注意,是子元素的文本。

  7. iter()

    相比iterfind, 支持传入 None 或者 *, 这样将会先深遍历整个子树。

  8. itertext()

    无参数,迭代器返回按文档序构成的元素的inner text. 递归遍历,包含子元素!