记录下方法,省得下次再找。目前只有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.ElementTree
为ET
.
一般用ET.parse
方法来将一个文本转换为element tree
对象, 记为tree
。经过测试,这个函数应该会把整个XML文本给读到内存里!再加上数据结构的信息,内存开销会比整个XML文本的大小还庞大很多。(没有专门测过,只是看了下加载后的内存,一个130M
的文本,加载进来后Python内存占据为500+M
)
然后用tree.getroot()
来得到root节点。
ET
中所有节点都是用Element
元素,其包含一些属性和方法,以下是说明:
-
tag
就是当前元素的标签,如
<data>
元素就是data
-
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”.
-
attrib
标签的属性,一个
key-value
字典 -
items(), keys(), get()
返回的是属性字典的信息(都是字典的方法)。
-
find(), findall(), iterfind()
用来寻找子元素(孩子节点)的方法。传入的是
标签名
或者path
-
findtext()
返回的是匹配到的第一个子元素的文本!注意,是子元素的文本。
-
iter()
相比
iterfind
, 支持传入 None 或者 *, 这样将会先深遍历整个子树。 -
itertext()
无参数,迭代器返回按文档序构成的元素的inner text. 递归遍历,包含子元素!