天天看点

python利用ElementTree读写xml

1. 写xml

from xml.etree.ElementTree import Element, SubElement, ElementTree
 
# 生成根节点
root =Element('root')
# 生成第一个子节点 head
head =SubElement(root, 'head')
# head 节点的子节点
title =SubElement(head, 'title')
title.text = 'Well Dola!'
# 生成 root 的第二个子节点 body
body =SubElement(root, 'body')
# body 的内容
body.text = 'I love Dola!'
tree =ElementTree(root)
           

这样就得到了一个 xml 树的对象 tree 以及它的根节点的对象 root

接着我们把它们变成 xml 串,有两个办法,一个是用 tree 对象的 write 方法将 xml 内容写成一个文件,还有一个是用 etree 的 tostring 方法转成 xml 字符串:

1 2 3 4 5

# 第一种

tree.write(

'result.xml'

, encoding

=

'utf-8'

)

# 第二种

xml_string

=

etree.tostring(root)

# xml_string 就是 xml 字符串了

但是第二种有一个问题,就是它没有

1

<?

xml

version

=

"1.0"

?>

这个头部定义内容:

1

'<

root

><

head

><

title

>Well Dola!</

title

></

head

><

body

>I love Dola!</

body

></

root

>'

怎么办呢?

有一个办法是使用 minidom 来实现,方法如下:

1 2 3 4 5

from

xml.dom

import

minidom

# 使用 minidom 解析

tree

=

minidom.parseString(xml_string)

# 重新生成 xml 字符串

xml_string

=

tree.toxml()

虽然让计算机多运行了一些代码,但是这样可以把问题解决掉。

最后生成的 xml 代码如下:

1

u'<?

xml

version

=

"1.0"

?><

root

><

head

><

title

>Well Dola!</

title

></

head

><

body

>I love Dola!</

body

></

root

>'

2. 读xml

ElementTree在Python标准库中有两种实现:一种是纯Python实现的,如xml.etree.ElementTree,另一种是速度快一点的xml.etree.cElementTree。注意:尽量使用C语言实现的那种,因为它速度更快,而且消耗的内存更少。

1)调用parse()方法,返回解析树

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

tree = ET.parse("country.xml")  # <class 'xml.etree.ElementTree.ElementTree'>
root = tree.getroot()           # 获取根节点 <Element 'data' at 0x02BF6A80>      

2)调用from_string(),返回解析树的根元素

import xml.etree.ElementTree as ET
data = open("country.xml").read()
root = ET.fromstring(data)   # <Element 'data' at 0x036168A0>      

3)调用ElementTree类ElementTree(self, element=None, file=None)  # 这里的element作为根节点

import xml.etree.ElementTree as ET
tree = ET.ElementTree(file="country.xml")  # <xml.etree.ElementTree.ElementTree object at 0x03031390>
root = tree.getroot()  # <Element 'data' at 0x030EA600>      

解析过程:

导入ElementTree,

import xml.etree.ElementTree as ET

解析Xml文件找到根节点:直接解析XML文件并获得根节点,

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

解析字符串,

root = ET.fromstring(country_data_as_string)

遍历根节点可以获得子节点,然后就可以根据需求拿到需要的字段了。

try: 
  import xml.etree.cElementTree as ET 
except ImportError: 
  import xml.etree.ElementTree as ET 
import sys,os
           

获取文件的根结点

tree = ET.parse(filename.xml) 
root = tree.getroot() 
           

获取所有为object的元素

root.findall('object')
           

获取object中为item的元素

ojbect.find('item')
           

读取item元素里面的内容

print item.text
           

获取属性值

print item.get['src'] 或 item['src']
           

主要方法:

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

参考:

https://www.cnblogs.com/zqchen/articles/3936805.html

https://www.cnblogs.com/hupeng1234/p/7262371.html

https://blog.csdn.net/a464057216/article/details/54915241

https://blog.csdn.net/q_l_s/article/details/71629804