前言
本部分不对 XML 的理论结构做深入分析,仅作为一个快速参考说明,用于记录在实际数据处理中常用的 XML 结构理解方式,以及 Python 中对 XML 节点的基本调用方法,便于后续快速查阅。
XML文件结构简介
XML文件的基本单位是由标签包起来的一整块内容,一个元素示例:
<item id="001"> hello </item>其中,整个标签(Tag)<item>.....</item>包起来的内容可以看作一个节点(xml中称作元素,Element)。写在<>中的id="001",这部分是节点的属性(Attribute),可以省略。标签中间包着的hello是标签的真正内容(Text)。
对应关系如下表所示:
| XML | 名字 | python |
| <item>...<\item> | Element(元素) | node |
| item | Tag(标签) | node.tag |
| id="001" | Attribute(属性) | node.attrib |
| hello | Text(内容) | node.text |
每个XML有一个根节点(Root Element),根节点包含多个子节点(Child Element),子节点也可以包含多个孙节点(Grandchild Element),以此类推。
<root> <child A><\child A> <child B ID="001"><\child B> <grandchild A><\grandchild A> <grandchild B><\grandchild B> <\root>上例所示的关系可以由树的形式画出:
root(根节点Root Element) ├── child A(1级子节点First-level Child Element) └── child B(1级子节点First-level Child Element) └── grandchild A(2级子节点Second-level Child Element) └── grandchild B(2级子节点Second-level Child Element)其中,child A 和child B是同辈节点,grandchild A和grandchild B是同辈节点。root是child A和child B的母节点,child B是grandchild A和grandchild B的母节点。
大致了解这些关系,就可以看懂XML的结构和内容了。
实例(仅包含部分节点),同色的节点互为同辈节点:
python函数调用
文件读取
python自带XML包,可以使用XML包读取XML文件,主要用到其中的ElementTree类。
import xml.etree.ElementTree as ET文件读取:
tree = ET.parse('D://ukbiobank_ecg_test.xml') root = tree.getroot()读取到的是一个树结构数据。
查看XML文件的结构
打印所有1级子节点的标签:
#打印所有1级子节点标签 for child in root: print(child.tag)运行结果:
打印所有节点标签:
def print_tree(element, level=0): print(" " * level + element.tag) for child in element: print_tree(child, level + 1) print_tree(root)运行结果(太长,只截取部分):
使用.find()方法查找节点
.find()基本用法:
node.find("tag")#只在当前子层寻找 node.find(".//tag")#查询所有子孙节点返回值是整个节点,不是列表(list)。
可以使用.find()来找到相应的节点,并调用print_tree函数并打印出其所有子节点的标签。例如查看ClinicalInfo这个节点和其所有子节点标签:
clinicinfo = root.find("ClinicalInfo") print_tree(clinicinfo)运行结果:
注意:如果有多个同名节点,.find()方法只会读取其中的第一个节点。
使用.findall()方法查找节点
有同名节点时,使用.findall()方法可以找到所有同名节点的集合。
node.findall("tag")示例:
waves = strip.findall("WaveformData")waves中包含了Tag为“WaveformData”的全部节点。