生成xml
xml规定根元素有且只能有一个
import xml.etree.ElementTree as et
'''
et.Element('tag')表示<tag></tag>这样一个完整的组合
tag表示上面组合的名字
et.Element复杂的写法还有<tag attrib="a">text</tag>
所以除了有tag,还有attrib,还有text. 通常能看出有text的Element一般都是最底层的Element
没有text的Element则是上层的Element
比如:
<tag>
<subtag attrib="a">ok</subtag>
<subtag attrib="b">ok</subtag>
<subtag2 attrib="b">ok</subtag>
</tag>
接下来对上面的各种组合用代码来实现
'''
import xml.etree.ElementTree as et
import xml.dom.minidom as minidom
e1 = et.Element('tag') # 生成标签名为tag的元素
e2 = et.Element('subtag') # 生成标签名为subtag的元素
e2.set('attrib', 'a') # 设置属性名为attrib的内容为a
e3 = et.Element('subtag') # 生成标签名为subtag的元素
e3.set('attrib', 'b') # 设置属性名为attrib的内容为b
e4 = et.Element('subtag2') # 生成标签名为subtag的元素
e4.set('attrib', 'b') # 设置属性名为attrib的内容为b
e1.append(e2) # 把标签名为subtag的元素设置成标签名为tag的元素的子元素,即subElement
e1.append(e3) # 把标签名为subtag的元素设置成标签名为tag的元素的子元素,即subElement
e1.append(e4) # 把标签名为subtag2的元素设置成标签名为tag的元素的子元素,即subElement
# 现在e1实际代表的内容已经是上面的xml了
# 现在验证一下结果的xml字符串是否正确
print(minidom.parseString(et.tostring(e1)).toprettyxml(indent='\t'))
'''
<?xml version="1.0" ?>
<tag>
<subtag attrib="a"/>
<subtag attrib="b"/>
<subtag2 attrib="b"/>
</tag>
'''
# 先在想把第2个subtag的属性attrib的内容改成c, 同时增加一个新属性attr,内容为d,同时第2个subtag的内容改成e
# 可以使用e1[1]或者e3都是一样的
e1[1].set('attrib','c')
e1[1].set('attr','d')
e1[1].text='e'
# 现在验证一下结果的xml字符串是否正确
print(minidom.parseString(et.tostring(e1)).toprettyxml(indent='\t'))
'''
<?xml version="1.0" ?>
<tag>
<subtag attrib="a"/>
<subtag attr="d" attrib="c">e</subtag>
<subtag2 attrib="b"/>
</tag>
'''
读取上面的xml
xml规定根元素有且只能有一个
'''
遍历Element
'''
tree = et.parse('test.xml')
e1 = tree.getroot() # 为了和上面衔接,把根的对象名字叫做e1
# 接下来的访问除了把set换成get,似乎也没什么特殊的了
# 如果不知道根元素下面到底是其它元素或者是内容,也不知道每个元素是否有属性,或者内容,那就只能尝试遍历了
# 对于一个元素,想要遍历所有子元素,直接像遍历链表那样就可以 for one_element in element
# 对于一个元素,想要遍历所有属性,像遍历字典那样即可,但是要这么写 for k,v in element.attrib.items()
# 对于一个元素,想要查询内容,直接这么写 print(element.text)