python机器可读数据-XML

时间:2021-06-11 08:54:55

XML

XML是一门标记语言。也就是说,它具有包含格式化数据的文档结构。

XML文档本质上只是格式特殊的数据文件。

在XML文件中有两个位置可以保存数据值:2个标签之间,标签的属性。

导入XML数据

import xml.etree.ElementTree as ET
tree = ET.parse('data-text.xml') #把整个XML对象保存在变量tree中
root = tree.getroot() #getroot函数获得树的根元素
print(list(root)) #变量root的所有方法和属性

这样就获得了data-text.xml 文件的根元素root,并把root变为列表形式。

得到:

[<Element 'QueryParameter' at 0x000000000D864908>, <Element 'QueryParameter' at 0x000000000D864A48>, <Element 'QueryParameter' at 0x000000000D864A98>, <Element 'QueryParameter' at 0x000000000D864AE8>, <Element 'QueryParameter' at 0x000000000D864B38>, <Element 'QueryParameter' at 0x000000000D864B88>, <Element 'Copyright' at 0x000000000D864BD8>, <Element 'Disclaimer' at 0x000000000D864CC8>, <Element 'Metadata' at 0x000000000D864D68>, <Element 'Data' at 0x000000000FCC9D68>]

其中Element后面引号中为根元素root的子元素。某些元素具有子元素(不是所有)。可以用find或findall利用标签搜索子元素。

import xml.etree.ElementTree as ET
tree = ET.parse('data-text.xml') #把整个XML对象保存在变量tree中
root = tree.getroot() #getroot函数获得树的根元素
data = root.find('Data')
print(data)

得到子元素data

<Element 'Data' at 0x000000000DA29A48>

得到列表形式data

print(list(data))
[<Element 'Observation' at 0x000000000DA29A98>, <Element 'Observation' at 0x000000000DA29DB8>, <Element 'Observation' at 0x000000000DA24138>, <Element 'Observation' at 0x000000000DA24458>, <Element 'Observation' at 0x000000000DA24778>, <Element 'Observation' at 0x000000000DA24A98>, <Element 'Observation' at 0x000000000DA24DB8>, <Element 'Observation' at 0x000000000DA1ED68>, <Element 'Observation' at 0x000000000DA1EC78>, <Element 'Observation' at 0x000000000DA1E958>, <Element 'Observation' at 0x000000000DA1E408>, <Element 'Observation' at 0x000000000DA1E368>, <Element 'Observation' at 0x000000000DA1BEA8>, <Element 'Observation' at 0x000000000DA1BC28> ]
Observation为data的子元素
事实上可以这样:
import xml.etree.ElementTree as ET
tree = ET.parse('data-text.xml') #把整个XML对象保存在变量tree中
root = tree.getroot() #getroot函数获得树的根元素
data = root.find('Data')
for i in data: #data中每一个元素i
for ii in i: #每一个元素i中的每一个元素ii
print(ii.attrib) #字典形式ii
print(ii.text) #2个标签之间的文本,没有则None

Kazil J, Jarmul K. Data Wrangling with Python[J]. 2016.