Python中xml.etree.ElementTree读写xml文件实例

2021/6/13 20:51:08

本文主要是介绍Python中xml.etree.ElementTree读写xml文件实例,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

xml 文件的内容
 1 <user>
 2     <name title="xml example">It is an xml example</name>
 3     <article name="My article">
 4       <algorithm name="a1">
 5         <interval name="n1">1000</interval>
 6      </algorithm>
 7     </article>
 8    <article name="Your article">
 9       <algorithm name="a2">
10         <interval name="n2">1001</interval>
11      </algorithm>
12     </article>
13     <profile>
14     <profile-name>profile_hard_easy</profile-name>
15     <level>
16     <level-value>1</level-value>
17     <level-type>hard</level-type>
18     </level>
19     <level>
20     <level-value>2</level-value>
21     <level-type>easy</level-type>
22     </level>
23     </profile>
24 </user>

 



  1 import os
  2 import xml.etree.ElementTree as ET
  3 
  4 '''
  5 Python 标准库中,提供了6种可以用于处理XML的包,本文举实例说明第6种
  6 1.xml.dom
  7 2.xml.dom.minidom
  8 3.xml.dom.pulldom
  9 4.xml.sax
 10 5.xml.parse.expat
 11 6.xml.etree.ElementTree(简称ET)
 12
 13 #获取当前文件所在目录
 14 print(os.path.dirname(__file__))
 15 #路径拼接,得到xml 文件的路径
 16 dirpath = os.path.join(os.path.dirname(__file__),"test2.xml")
 17 
 18 #用ET.ElementTree 读取xml文件,将xml文件解析为tree
 19 '''
    说明:
 20 ET提供了两个对象ElementTree将整个XML文档转化为树, Element则代表着树上的单个节点。对整个XML文档的交互(读取,写入,查找需要的元素)
    一般是在 ElementTree层面进行的。对单个XML元素及其子元素,则是在 Element层面进行的。
 21 '''
 22 tree = ET.ElementTree(file=dirpath)
 23 #获取xml 文件的根结点
 24 root = tree.getroot()
 25 #xml 的根结点是一个Element 对象.
 26 '''
 27 Element 对象常用的属性有:
 28 Element.tag --输出标签的名称
 29 Element.text --输出标签包含的内容
 30 Element.attrib --标签的属性
 31 '''
 32 print(root) #输出: <Element 'user' at 0x000001C02A2DB818>
 33 #查看xml根结点root的属性
 34 print(root.tag,root.attrib) #输出: user {}, 根结点没有属性
 35 
 36 #可以通过递归方式,遍历根结点的所有子元素,获取数中所有的元素
 37 for child_root in root:
 38    print(child_root.tag,child_root.text,child_root.attrib)
 39 '''
 40 输出:
 41 name 
 42        {}
 43 article 
 44        {'name': 'My article'}
 45 profile 
 46      {}
 47 '''
 48 #根据索引访问特定的子元素
 49 print(root[1].tag,root[1].text,root[1].attrib)
 50 '''
 51 输出:
 52 article 
 53        {'name': 'My article'}
 54 '''
 55 
 56 #使用ElementTree iter() 方法遍历 tree的所有元素
 57 for elem in root.iter():
 58    print(elem.tag,elem.attrib)
 59    if elem.tag == "profile":
 60       print("=========Find it, I can do what I want")
 61 
 62 #使用ElementTree iter() 方法,遍历指定tag的元素,找到自己感兴趣的属性
 63 
 64 for sub_elem in root.iter(tag="article"):
 65    print(sub_elem.tag,sub_elem.attrib)
 66    
 67 #通过XPath 查找元素
 68 
 69 '''
 70 ElementTree 对象常用到的方法如下,它们的相同点是接收Xpath路径作为参数,不同点是
 71 1. find 返回第一个匹配的子元素
 72 2. findall 以列表的形式返回所有匹配的子元素
 73 3. iterfind 则返回一个所有匹配元素的迭代器(iterator)
 74 
 75 Xpath 使用例子:
 76 1. 返回所有tag为article的元素:
 77 findall("article")
 78 2. 返回 tag为article下之下所有tag为algorithm的元素,注意格式必须为 父节点/一代子节点,而不能为父节点/二代子节点,比如article/interval 就会找不到
 79 findall(article/algorithm)
 80 
 81 '''
 82 '''
 83 1. find 输出:
 84 algorithm
 85          {}
 86 '''
 87 for elem in root.find("article"):
 88    print(elem.tag,elem.text,elem.attrib)
 89 
 90 '''
 91 2. findall 和 iterfind 输出:
 92 article
 93        {'name': 'My article'}
 94 article
 95        {'name': 'Your article'}
 96 '''
 97 for elem in root.findall("article"):
 98    print(elem.tag,elem.text,elem.attrib)
 99 
100 for elem in root.findall("article"):
101    print(elem.tag,elem.text,elem.attrib)
102    
103    
104 #生成和更改xml 文件
105 
106 '''
107 ElementTree对象的write方法可以往xml写入内容
108 '''
109 #为根节点的第一个子元素增加属性 color=red
110 print(root[0].tag,root[0].attrib) #name {'title': 'xml example'}
111 root[0].set("color","red")
112 print(root[0].tag,root[0].attrib) #name {'title': 'xml example', 'color': 'red'}
113 
114 #删掉根节点的其中一个子元素
115 i=0
116 for item in root:
117    print(i,item.tag)
118    i=i+1
119 del root[4] #删掉最后一个子元素 foot
120 i=0
121 for item in root:
122    print(i,item.tag)
123    i=i+1
124 
125 #将修改后的文件写入到一个新的文件 test3.xml,新文档的元素属性顺序与原文档不同。这是因为ET是以字典的形式保存属性的,而字典是一个无序的数据结构。同时 XML也不关注属性的顺序,故乱序的影响不大
126 tree.write(os.path.join(os.path.dirname(__file__),"test3.xml"))
127 
128 #构建一个新的xml文件
129 #生成根元素
130 root=ET.Element("root")
131 #生成子元素 A
132 a=ET.Element("A")
133 #增加元素A的子元素 child1
134 a_child=ET.SubElement(a,"child1")
135 a_child.text="I'm child of A"
136 #增加元素A的子元素 child2
137 a_child1=ET.SubElement(a,"child2")
138 #生成子元素B
139 b=ET.Element("B")
140 #增加元素B的子元素child1
141 b_child=ET.SubElement(b,"child1")
142 b_child.text="I'm child of B"
143 b_child.set("name","book") #set() 接收的是 key,value 形式
144 
145 #将a和b 组成一个元组传入extend()方法中,元素 A和B作为根元素的子元素
146 root.extend((a,b))
147 trees=ET.ElementTree(root)
148 #将trees 写入到文件 test4.xml, 内容为 <root><A><child1>I'm child of A</child1><child2 /></A><B><child1 name="book">I'm child of B</child1></B></root>
149 trees.write(os.path.join(os.path.dirname(__file__),"test4.xml"))

 



这篇关于Python中xml.etree.ElementTree读写xml文件实例的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程