Python:xml读写(xml.etree.ElementTree模块使用)

#!/usr/bin/env python
# coding:UTF-8


"""
@version: python3.x
@author:曹新健
@contact: [email protected]
@software: PyCharm
@file: xml.etree.ElementTree模块使用.py
@time: 2018/11/14 14:34
"""

"""
1、ElementTree实例代表整个XML树,可以使用getroot()来获取根节点。Element表示树上的单个节点,它是
   iterable的。操作整个XML文档时使用ElementTree类,比如读写XML文件。操作XML元素及其子元素时使用
   Element类。
2、xml.etree.cElementTree是用C语言实现的模块,接口上与xml.etree.ElementTree完全相同,然而处理效率
   更快,但并不是所有平台均支持,因为我们可以尝试导入,若没有就导入ElementTree

3、每个元素包含如下属性:
  tag:string对象,表示数据代表的种类。
  attrib:dictionary对象,表示附有的属性。
  text:string对象,表示element的内容。
  tail:string对象,表示element闭合之后的尾迹。
  若干子元素(child elements) 

4、查找方法:
    Element.findall(match)方法通过tag名字或xpath匹配第一层子元素,按照子元素顺序以列表形式返回所有
    匹配的元素。 
    Element.find(match)方法通过tag名字或xpath在第一层子元素中查找第一个匹配的元素,返回匹配的元素
    或None。 
    Element.get(key, default=None)返回元素名字为key的属性值,如果没有找到,返回None或设置的默认值。

5、通过Element对象的方法修改Element对象
    Element.text=value可以直接修改其text属性。
    Element.tail=value可以直接修改其tail属性。
    Element.set(key, vlaue)可以添加新的attrib。
    Element.append(subelement)可以添加新的子元素。
    Element.extend(subelements)添加子元素的列表(参数类型是序列)。
    Element.remove(subelement)可以删除子元素

6、使用ET.SubElement(parent, tag_name)可以快速建立子元素关系,使用ET.dump(elem)可以输出elem的内容
   到标准输出(elem可以是一个Element对象或ElementTree对象)
   
7、ET.parse(filename)一次性将整个XML文件加载到内存,ET.iterparse(filename)采用增量形式加载XML数据,
   占据更小的内存空间。
"""
try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

tree = ET.parse("country_data.xml")
root = tree.getroot()

"""
ET.dump(root)
print(root.tag)
print(root.attrib)
print(root.text.strip())
print(root.tail)
tree.findall('country/*')  //查找孙子节点元素
tree.findall('.//rank')  //查找任意层次元素
tree.findall('country[@name]')   // 包含name属性的country
tree.findall('country[@name="Singapore"]')   // name属性为Singapore的country
tree.findall('country[rank]')   // 孩子元素中包含rank的country
tree.findall('country[rank="1"]')   // 孩子元素中包含rank且rank元素的text为1的country
tree.findall('country[1]')     // 第一个country
tree.findall('country[last()]')   // 最后一个country
tree.findall('country[last()-1]')    // 倒数第二个country
"""

#遍历子节点
def getChild(elment,indent=""):
    indent = indent
    for child in elment:
        if child.text:
            print(indent,child.tag,child.attrib,child.text.strip(),root.tail)
        else:
            print(indent,child.tag, child.attrib, None, root.tail)

        getChild(child,indent + "    ")

getChild(root)

print("*"*40)

for node in tree.findall('country/year'):
     print(node.tag,node.text)
     node.tag = "newyear"
     node.text = "2018"
     print(node.tag,node.text)
     node.tag = "year"

tree.write('country_data.xml') #保存

猜你喜欢

转载自blog.csdn.net/caoxinjian423/article/details/84195987