I have the following XML structure:
<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>
and I would like to read each of these into a created object in Python 3.
I have the following loop:
# Create the solar system
celestialBodies = list()
for i in range(10):
planet = Planet("Mercury", 1000000, 0.5, 0.1, ['Moon A', 'Moon B'], ['Hydrogen, Nitrogen'], 8, 0.15)
celestialBodies.append(planet)
but as you can see, instead of hardcoding the planets myself, I would like to get the data from the XML file in a nice way. So instead of me saying "Mercury", it should traverse through the tree and get the values of each celestial body into the variables and create the object.
What I can't get it through is the XML reading part. No matter what I tried I could not loop through the levels to read the values into the variables. I've already tried BeautifulSoup, lxml, ET but no luck.
Some trials:
root = lxml.etree.fromstring('planet_info.xml')
results = root.findall('planets')
textnumbers = [r.find('planet/name').text for r in results]
print(textnumbers)
or
solarSystem = ET.parse('planet_info.xml')
celestialBodies = solarSystem.getroot()
for bodies in celestialBodies:
for star in bodies[0]:
print(star.tag, star.attrib, star.nodeValue)
with each resulting with errors. There should be a straightforward way of doing this.
Any suggestions?
EDIT: So with the following I am able to reach the two children but no more:
# Get the data from the XML
solarSystem = ET.parse('planet_info.xml')
celestialBodies = solarSystem.getroot()
for bodies in celestialBodies:
print(bodies.tag, bodies.attrib)
output:
stars {}
planets {}
How to loop inside these and retrieve the values though?