这里有一个在数据结构上迭代的简单方法。为了保持代码的自包含性,我直接从字符串读取XML,而不是从文件读取。
import xml.etree.ElementTree as ET
data = '''\
<?xml version="1.0"?>
<celestialBodies>
<stars>
<star>
<item name="Name">Sun</item>
<item name="Distance from the Earth">100000</item>
<item name="Size">9</item>
<item name="Moons">A,B,C</item>
<item name="Gravity">0.4</item>
<item name="Elements Found">H, HE</item>
<item name="Orbiting Time">15</item>
<item name="Day Time">12</item>
</star>
</stars>
<planets>
<planet>
<item name="Name">Mercury</item>
<item name="Distance from the Earth">100000</item>
<item name="Size">9</item>
<item name="Moons">A,B,C</item>
<item name="Gravity">0.4</item>
<item name="Elements Found">H, HE, C</item>
<item name="Orbiting Time">15</item>
<item name="Day Time">12</item>
</planet>
<planet>
<item name="Name">Venus</item>
<item name="Distance from the Earth">100000</item>
<item name="Size">9</item>
<item name="Moons">A,B,C</item>
<item name="Gravity">0.4</item>
<item name="Elements Found">H, HE, C</item>
<item name="Orbiting Time">15</item>
<item name="Day Time">12</item>
</planet>
<planet>
<item name="Name">Earth</item>
<item name="Distance from the Earth">0</item>
<item name="Size">9</item>
<item name="Moons">A,B,C</item>
<item name="Gravity">0.4</item>
<item name="Elements Found">H, HE, C</item>
<item name="Orbiting Time">15</item>
<item name="Day Time">12</item>
</planet>
<planet>
<item name="Name">Mars</item>
<item name="Distance from the Earth">100000</item>
<item name="Size">9</item>
<item name="Moons">A,B,C</item>
<item name="Gravity">0.4</item>
<item name="Elements Found">H, HE, C</item>
<item name="Orbiting Time">15</item>
<item name="Day Time">12</item>
</planet>
<planet>
<item name="Name">Jupiter</item>
<item name="Distance from the Earth">100000</item>
<item name="Size">9</item>
<item name="Moons">A,B,C</item>
<item name="Gravity">0.4</item>
<item name="Elements Found">H, HE, C</item>
<item name="Orbiting Time">15</item>
<item name="Day Time">12</item>
</planet>
<planet>
<item name="Name">Saturn</item>
<item name="Distance from the Earth">100000</item>
<item name="Size">9</item>
<item name="Moons">A,B,C</item>
<item name="Gravity">0.4</item>
<item name="Elements Found">H, HE, C</item>
<item name="Orbiting Time">15</item>
<item name="Day Time">12</item>
</planet>
<planet>
<item name="Name">Uranus</item>
<item name="Distance from the Earth">100000</item>
<item name="Size">9</item>
<item name="Moons">A,B,C</item>
<item name="Gravity">0.4</item>
<item name="Elements Found">H, HE, C</item>
<item name="Orbiting Time">15</item>
<item name="Day Time">12</item>
</planet>
<planet>
<item name="Name">Neptune</item>
<item name="Distance from the Earth">100000</item>
<item name="Size">9</item>
<item name="Moons">A,B,C</item>
<item name="Gravity">0.4</item>
<item name="Elements Found">H, HE, C</item>
<item name="Orbiting Time">15</item>
<item name="Day Time">12</item>
</planet>
<planet>
<item name="Name">Pluto</item>
<item name="Distance from the Earth">100000</item>
<item name="Size">9</item>
<item name="Moons">A,B,C</item>
<item name="Gravity">0.4</item>
<item name="Elements Found">H, HE, C</item>
<item name="Orbiting Time">15</item>
<item name="Day Time">12</item>
</planet>
</planets>
</celestialBodies>
'''
root = ET.fromstring(data)
for kind in root:
print(kind.tag)
for child in kind:
print(' '*2, child.tag)
for item in child:
print(' '*4, '{!r}: {!r}'.format(item.attrib['name'], item.text))
print()
输出
stars
star
'Name': 'Sun'
'Distance from the Earth': '100000'
'Size': '9'
'Moons': 'A,B,C'
'Gravity': '0.4'
'Elements Found': 'H, HE'
'Orbiting Time': '15'
'Day Time': '12'
planets
planet
'Name': 'Mercury'
'Distance from the Earth': '100000'
'Size': '9'
'Moons': 'A,B,C'
'Gravity': '0.4'
'Elements Found': 'H, HE, C'
'Orbiting Time': '15'
'Day Time': '12'
planet
'Name': 'Venus'
'Distance from the Earth': '100000'
'Size': '9'
'Moons': 'A,B,C'
'Gravity': '0.4'
'Elements Found': 'H, HE, C'
'Orbiting Time': '15'
'Day Time': '12'
planet
'Name': 'Earth'
'Distance from the Earth': '0'
'Size': '9'
'Moons': 'A,B,C'
'Gravity': '0.4'
'Elements Found': 'H, HE, C'
'Orbiting Time': '15'
'Day Time': '12'
planet
'Name': 'Mars'
'Distance from the Earth': '100000'
'Size': '9'
'Moons': 'A,B,C'
'Gravity': '0.4'
'Elements Found': 'H, HE, C'
'Orbiting Time': '15'
'Day Time': '12'
planet
'Name': 'Jupiter'
'Distance from the Earth': '100000'
'Size': '9'
'Moons': 'A,B,C'
'Gravity': '0.4'
'Elements Found': 'H, HE, C'
'Orbiting Time': '15'
'Day Time': '12'
planet
'Name': 'Saturn'
'Distance from the Earth': '100000'
'Size': '9'
'Moons': 'A,B,C'
'Gravity': '0.4'
'Elements Found': 'H, HE, C'
'Orbiting Time': '15'
'Day Time': '12'
planet
'Name': 'Uranus'
'Distance from the Earth': '100000'
'Size': '9'
'Moons': 'A,B,C'
'Gravity': '0.4'
'Elements Found': 'H, HE, C'
'Orbiting Time': '15'
'Day Time': '12'
planet
'Name': 'Neptune'
'Distance from the Earth': '100000'
'Size': '9'
'Moons': 'A,B,C'
'Gravity': '0.4'
'Elements Found': 'H, HE, C'
'Orbiting Time': '15'
'Day Time': '12'
planet
'Name': 'Pluto'
'Distance from the Earth': '100000'
'Size': '9'
'Moons': 'A,B,C'
'Gravity': '0.4'
'Elements Found': 'H, HE, C'
'Orbiting Time': '15'
'Day Time': '12'
这种变化将数据加载到包含两个列表的字典中,一个用于恒星,一个用于行星。这些列表中的每一个都包含该类别中找到的每个正文的词典。我们可以使用
json
模块可以很好地打印数据。
import xml.etree.ElementTree as ET
import json
root = ET.fromstring(data)
bodies = {}
for kind in root:
bodies[kind.tag] = bodylist = []
for child in kind:
bodylist.append({item.attrib['name']: item.text for item in child})
print(json.dumps(bodies, indent=4))
输出
{
"stars": [
{
"Name": "Sun",
"Distance from the Earth": "100000",
"Size": "9",
"Moons": "A,B,C",
"Gravity": "0.4",
"Elements Found": "H, HE",
"Orbiting Time": "15",
"Day Time": "12"
}
],
"planets": [
{
"Name": "Mercury",
"Distance from the Earth": "100000",
"Size": "9",
"Moons": "A,B,C",
"Gravity": "0.4",
"Elements Found": "H, HE, C",
"Orbiting Time": "15",
"Day Time": "12"
},
{
"Name": "Venus",
"Distance from the Earth": "100000",
"Size": "9",
"Moons": "A,B,C",
"Gravity": "0.4",
"Elements Found": "H, HE, C",
"Orbiting Time": "15",
"Day Time": "12"
},
{
"Name": "Earth",
"Distance from the Earth": "0",
"Size": "9",
"Moons": "A,B,C",
"Gravity": "0.4",
"Elements Found": "H, HE, C",
"Orbiting Time": "15",
"Day Time": "12"
},
{
"Name": "Mars",
"Distance from the Earth": "100000",
"Size": "9",
"Moons": "A,B,C",
"Gravity": "0.4",
"Elements Found": "H, HE, C",
"Orbiting Time": "15",
"Day Time": "12"
},
{
"Name": "Jupiter",
"Distance from the Earth": "100000",
"Size": "9",
"Moons": "A,B,C",
"Gravity": "0.4",
"Elements Found": "H, HE, C",
"Orbiting Time": "15",
"Day Time": "12"
},
{
"Name": "Saturn",
"Distance from the Earth": "100000",
"Size": "9",
"Moons": "A,B,C",
"Gravity": "0.4",
"Elements Found": "H, HE, C",
"Orbiting Time": "15",
"Day Time": "12"
},
{
"Name": "Uranus",
"Distance from the Earth": "100000",
"Size": "9",
"Moons": "A,B,C",
"Gravity": "0.4",
"Elements Found": "H, HE, C",
"Orbiting Time": "15",
"Day Time": "12"
},
{
"Name": "Neptune",
"Distance from the Earth": "100000",
"Size": "9",
"Moons": "A,B,C",
"Gravity": "0.4",
"Elements Found": "H, HE, C",
"Orbiting Time": "15",
"Day Time": "12"
},
{
"Name": "Pluto",
"Distance from the Earth": "100000",
"Size": "9",
"Moons": "A,B,C",
"Gravity": "0.4",
"Elements Found": "H, HE, C",
"Orbiting Time": "15",
"Day Time": "12"
}
]
}