Python解析XML

Python解析XML文件

文本记录如何利用python解析XML文件:

首先,XML示例文件如下所示(test.xml):

<?xml version="1.0" encoding="ISO-8859-1"?>
<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>

 

1. 导入解析XML文件的模块:xml.etree.ElementTree 

import xml.etree.ElementTree  as ET

 

注:解析XML方法很多,这里只介绍其一,xml.etree.ElementTree是按照XML文件的格式,将其看作树来解析。

2. 解析步骤:

(1) 实例化Element对象:

tree = ET.ElementTree()

 

 可见直接调用ET模块的ElementTree方法返回一个Element对象,该对象指向XML树的根节点。

现在来介绍Element对象的几个常用属性:

  • tag:获取该元素节点的标签。    比如根节点的标签是<data>,那么tree.tag返回的就是字符串data
  • attrib:获取噶元素节点的属性字典,没有属性就返回空字典。   比如元素标签为country的节点的属性为name='Liechetenstein'那么返回的就是字典{name : 'Liechetenstein'}
  • text:若该元素内没有再嵌套,那么返回的就是该元素的内容(类型视元素内容的类型而定)。    比如year元素调用text后返回的是2008

(2)载入XML文件:

上一步仅仅是创建了XML树的对象,其中没有内容,现在就要载入xml文件来使这颗XML树具有具体含义。

tree.parse("test.xml")

 

Element对象调用parse方法将xml文件载入进来,其中parse方法的参数便是xml文件的路径。

这样,这颗xml树就要具体含义了,其含义与载入的xml文件含义同。

(3) 现在开始操作xml树(操作xml文件的内容):

1. 载入xml文件后的树是指向根节点的:

print(tree.tag)

输出:

2. 可以使用len()函数查看该节点的子节点个数:

print(len(tree))

3. 可以按下标索引子节点:

比如tree[0].tag的结果是country,意思是根节点的第一个子节点的标签是country

4. Element对象的findall()方法:

tree.findall('country')

该方法接受参数为检索的元素标签(String类型),返回的是一个列表(列表中的每个值都是Element对象,即检索到的元素):

比如:

children = tree.findall('country')    # 调用方法findall,会在tree的子节点中寻找以country为标签的元素,将找到的元素放入列表中,最后返回这个列表
for child in children:           # for循环遍历这个列表中的每个元素,循环体print语句输出每个元素的长度
    print(len(child))

 

 运行结果如下所示:(可以对比test.xml文件来理解输出)

 5. 也可以使用find()函数:

child1 = tree[0]      # child1锁定到tree的第一个孩子结点
print(child1.find('year').text)       # child.find('year')指向该节点的year元素,然后.text返回该元素的内容

运行结果:(果然不出所料)

一次性操作xml文件示范代码:

childtag  = tree[0].tag             # 根目录的孩子结点的标签
children = tree.findall(childtag)   # 返回所有根目录孩子结点元素的列表
for child in children:              # 遍历该列表
    for i in range(len(child)):     # 获取每个孩子结点元素的长度,然后遍历输出所有内容
        print(child[i].tag + ':' + str(child[i].text))
    print()

运行结果如下:

 

(4)写XML文件

import xml.etree.ElementTree as ET

root = ET.Element('data')   # 创建根节点调用方法Element
# 创建子节点用方法SubElement,其中第一个参数为他的父节点,第二个参数为该节点的标签
# 第三个参数为该节点的属性(可选)
student = ET.SubElement(root,'student',sex = 'boy')
# 创建子节点,其父节点为student,用text来设置该节点的内容
ET.SubElement(student,'name').text = 'Tony'
ET.SubElement(student,'age').text = '22'
# 与student节点同级的节点
student = ET.SubElement(root,'student',sex = 'girl')
ET.SubElement(student,'name').text = 'Tina'
ET.SubElement(student,'age').text = '21'
# xml的写工作完成后调用ElementTree方法创建一颗xml树
# 其参数为Element类型,即这颗树的根
tree = ET.ElementTree(root)
# ElementTree对象调用write方法,将数写入到xml文件中
# 第一个参数为文件路径,第二个参为编码格式(记得写)
tree.write('test.xml',encoding='utf-8')

运行结果如下:

 

----------------------------------------------------------  参考API ---------------------------------------------------------------

1.函数

1.xml.etree.ElementTree.Comment(text=None):注释元素工厂,这个工厂函数创建一个特殊的元素,将被序列化为XML注释标准的序列化器。注释字符串可以是bytestring或Unicode字符串,文本是包含注释字符串的字符串,返回表示注释的元素实例。

注意:XMLParser忽略了输入中的注释,而不是为它们创建注释对象。如果ElementTree使用其中一个元素方法插入到树中,它只会包含注释节点。

2.xml.etree.ElementTree.dump(elem):把元素树或元素结构写入sys.stdout。这个函数只用于调试。

3.xml.etree.ElementTree.fromstring(text):从字符串常量解析XML,XML()方法解析的方式也一样,它们返回的都是一个Element实例。

4.xml.etree.ElementTree.iselement(element):检查对手是否是有效的element对象,如果是element对象返回true,否则返回false.

5.xml.etree.ElementTree.iterparse(source, events=None, parser=None):在元素树中逐步解析XML,并且报告用户的情况。资源是文件名或包含xml数据的文件对象。一系列的事件需要被报告,支持事件的字符串有 “start”, “end”, “start-ns” and “end-ns”,如果忽略事件,则只报告“end”事件。解析器是一个可选的解析器实例。如果没有给出,则使用标准的XMLParser解析器。解析器必须是XMLParser的子类,并且只能使用默认的TreeBuilder作为目标。使用iterparse()函数返回一个迭代器对象。

6.xml.etree.ElementTree.parse(source, parser=None):把XML文件解析成 element tree,资源是一个文件名或包含XML数据的文件对象,解析器是一个可选的解析器实例。如果没有指定parser的参数值,默认使用的是XMLParser解析器。调用此函数返回ElementTree实例对象。

7.xml.etree.ElementTree.ProcessingInstruction(target, text=None):返回一个元素实例,表示一个处理指令。

8.xml.etree.ElementTree.register_namespace(prefix, uri):注册命名空间前缀, registry是全局的,任何现有的前缀或名称空间URI的映射都将被删除。这个命名空间中的标签和属性将被给定的前缀给序列化。

9.xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra):此函数是一个Subelement工厂,这个函数用于创建 element 实例,并将其添加到现有的 element 中。

10.xml.etree.ElementTree.tostring(element, encoding=”us-ascii”, method=”xml”, *, short_empty_elements=True): 转化为字符串。
01.element:表示一个element实例
02. encoding:默认编码是”us-ascii”
03.method:默认是”xml”,可以选择“html”、“text”

11.xml.etree.ElementTree.tostringlist(element, encoding=”us-ascii”, method=”xml”, *, short_empty_elements=True):转化成字符串列表。

12.xml.etree.ElementTree.XML(text, parser=None):
01.text :包含xml数据的字符串。
02.parser:解析器默认是XMLParser
03.返回的是一个Element实例

13.xml.etree.ElementTree.XMLID(text, parser=None):返回一个包含Element实例和字典的元组。

2.Element 对象

class xml.etree.ElementTree.Element(tag, attrib={}, **extra)

1.tag: 标签
2.text: 去除标签,获得标签中的内容。
3.attrib: 获取标签中的属性和属性值。
4.tail: 这个属性可以用来保存与元素相关联的附加数据。它的值通常是字符串,但可能是特定于应用程序的对象。

Element 对象的方法

1.clear():清除所有子元素和所有属性,并将文本和尾部属性设置为None。

2.get(attribute_name, default=None):通过指定属性名获取属性值。

3.items():以键值对的形式返回元素属性。

4.keys():以列表的方式返回元素名。

5.set(attribute_name,attribute_value):在某标签中设置属性和属性值。

6.append(subelement):将元素子元素添加到元素的子元素内部列表的末尾。

7.extend(subelements):追加子元素。

8.find(match, namespaces=None):找到第一个匹配的子元素,match可以是标签名或者path。返回Elememt实例或None。

9.findall(match, namespaces=None):找到所有匹配的子元素,返回的是一个元素列表。

10.findtext(match, default=None, namespaces=None):找到匹配第一个子元素的文本。返回的是匹配元素中的文本内容。

11.getchildren():Python3.2后使用 list(elem) 或 iteration.

12.getiterator(tag=None):Python3.2后使用 Element.iter()

13.iter(tag=None):以当前元素为根创建树迭代器。迭代器遍历这个元素和它下面的所有元素(深度优先级)。如果标签不是None或’*’,那么只有标签等于标签的元素才会从迭代器返回。如果在迭代过程中修改树结构,则结果是未定义的。

14.iterfind(match, namespaces=None):匹配满足条件的子元素,返回元素。

15.itertext():创建一个文本迭代器。迭代器循环遍历此元素和所有子元素,以文档顺序,并返回所有内部文本。

16.makeelement(tag, attrib):此方法使用SubElement()函数代替。

17.remove(subelement):删除子元素。

3.ElementTree 对象

class xml.etree.ElementTree.ElementTree(element=None, file=None):

ElementTree是一个包装器类,这个类表示一个完整的元素层次结构,并为标准XML的序列化添加了一些额外的支持。

1._setroot(element):替换根元素,原来的根元素中的内容会消失。

2.find(match, namespaces=None):从根元素开始匹配和 Element.find()作用一样。

3.findall(match, namespaces=None):从根元素开始匹配和 Element.findall()作用一样。

4.findtext(match, default=None, namespaces=None):从根元素开始匹配和 Element.findtext()作用一样。

5.getiterator(tag=None):Python3.2后使用 ElementTree.iter() 代替。

6.iter(tag=None):迭代所有元素

7.iterfind(match, namespaces=None):从根元素开始匹配和 Element.iterfind()作用一样。

8.parse(source, parser=None):解析xml文本,返回根元素。

9.write(file, encoding=”us-ascii”, xml_declaration=None, default_namespace=None, method=”xml”, *, short_empty_elements=True):写出XML文本。

posted @ 2018-09-25 15:52  ThisYanOK  阅读(10118)  评论(0编辑  收藏  举报