当需要读取简单的xml格式文件时,可以使用python中的ElementTree模块。但ElementTree模块也有它的局限性,有时需要自定义解析xml文件的方式。
以下是python自定义解析简单xml格式文件的方法的攻略:
1. 解析XML文件
首先要做的是使用ElementTree模块解析xml文件。我们可以将xml文件读取为一个字符串,然后使用ElementTree的fromstring方法将其解析为一个元素树。代码如下:
import xml.etree.ElementTree as ET
xml_string = '<root><name>John</name><age>30</age></root>'
root = ET.fromstring(xml_string)
这个示例将xml字符串<root><name>John</name><age>30</age></root>
解析为一个名为root
的元素树。
2. 遍历XML元素
我们可以使用ElementTree模块的iter()
方法来遍历元素树中的元素,并获取元素的属性和文本内容。
import xml.etree.ElementTree as ET
xml_string = '<root><name>John</name><age>30</age></root>'
root = ET.fromstring(xml_string)
for child in root.iter():
print(child.tag, child.text)
此示例遍历root
元素树并将每个元素的标签和文本内容打印到终端。
3. 自定义解析xml文件
使用ElementTree模块解析xml文件时,我们可以根据xml文件的结构定义元素类,以便更方便地访问元素和元素的属性。以下是一个自定义解析xml文件的示例:
from typing import Dict
import xml.etree.ElementTree as ET
class Person:
def __init__(self, name: str, age: str):
self.name = name
self.age = age
def __repr__(self):
return f"Name: {self.name}, Age: {self.age}"
def parse_person(elem: ET.Element) -> Person:
name = elem.find("name").text.strip()
age = elem.find("age").text.strip()
return Person(name, age)
def parse_people(xml_string: str) -> Dict[str, Person]:
root = ET.fromstring(xml_string)
people = {}
for elem in root.findall("person"):
person = parse_person(elem)
people[person.name] = person
return people
xml_string = """
<people>
<person>
<name>John</name>
<age>30</age>
</person>
<person>
<name>Jane</name>
<age>28</age>
</person>
</people>
"""
people = parse_people(xml_string)
print(people)
此示例定义了一个名为Person
的类,它具有name
和age
属性。parse_person
函数将ET.Element
对象解析为一个Person
对象,并返回其实例。parse_people
函数解析整个xml字符串并返回一个包含Person
对象的字典。
此示例输出:
{'John': Name: John, Age: 30, 'Jane': Name: Jane, Age: 28}
另一个示例:
import xml.etree.ElementTree as ET
class Song:
def __init__(self, name, artist, album, year):
self.name = name
self.artist = artist
self.album = album
self.year = year
def parse_song(elem):
name = elem.find("name").text
artist = elem.find("artist").text
album = elem.find("album").text
year = elem.find("year").text
return Song(name, artist, album, year)
def parse_music(xml_string):
root = ET.fromstring(xml_string)
music = []
for elem in root.findall("song"):
song = parse_song(elem)
music.append(song)
return music
xml_string = """
<music>
<song>
<name>Yesterday</name>
<artist>The Beatles</artist>
<album>Help!</album>
<year>1965</year>
</song>
<song>
<name>Bohemian Rhapsody</name>
<artist>Queen</artist>
<album>A Night at the Opera</album>
<year>1975</year>
</song>
</music>
"""
music = parse_music(xml_string)
for song in music:
print(f"{song.name} by {song.artist} from {song.album} ({song.year})")
此示例定义了一个名为Song
的类,并使用parse_song
函数将ET.Element
对象解析为Song
对象。parse_music
函数解析整个xml字符串并将每首歌曲的Song
对象添加到列表中。
此示例输出:
Yesterday by The Beatles from Help! (1965)
Bohemian Rhapsody by Queen from A Night at the Opera (1975)
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python自定义解析简单xml格式文件的方法 - Python技术站