簡體   English   中英

循環解析XML數據以在Python 3中創建多個對象

[英]Parsing XML Data in a loop to create multiple objects in Python 3

我具有以下XML結構:

<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>

我想將它們中的每一個都讀入Python 3中的一個創建的對象中。

我有以下循環:

# 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)

但是正如您所看到的,我希望自己以一種不錯的方式從XML文件中獲取數據,而不是自己對行星進行硬編碼。 因此,與其說“水星”,不如說它穿過樹,並將每個天體的值都輸入變量中並創建對象。

我無法理解的是XML閱讀部分。 無論我嘗試了什么,我都無法遍歷各個級別以將值讀入變量。 我已經嘗試過BeautifulSoup,lxml,ET,但是沒有運氣。

一些試驗:

   root = lxml.etree.fromstring('planet_info.xml')
   results = root.findall('planets')
   textnumbers = [r.find('planet/name').text for r in results]
   print(textnumbers)

要么

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)

每個都會導致錯誤。 應該有一個簡單的方法來做到這一點。

有什么建議么?

編輯:因此,通過以下操作,我可以達到兩個孩子,但沒有更多:

   # Get the data from the XML
   solarSystem = ET.parse('planet_info.xml')
   celestialBodies = solarSystem.getroot()
   for bodies in celestialBodies:
       print(bodies.tag, bodies.attrib)

輸出:

stars {}
planets {}

如何在這些內部循環並檢索值?

此代碼使用etree起作用。 您缺少一行僅返回name設置為某個值的item元素的行。

import xml.etree.ElementTree as ET

root = ET.parse(PATH_TO_YOUR_FILE)
planets = root.findall('./planets/planet')

planets_list = []
for planet in planets:
        name = planet.find("./item[@name='Name']").text
        d = planet.find("./item[@name='Distance from the Earth']").text
        //...
        planets_list.append(Planet(name, d, ...)

從這里您應該可以自己解決其余的問題。 希望能幫助到你。

首先,您可以找到行星和恆星元素,將它們添加到列表中,然后從中選擇第一個值。

import xml.etree.ElementTree as ET  
dump = ET.parse('planet_info.xml') 
root = dump.getroot()  
planet_name = star_name = planet_list = []  
for content in root:
    planet_name = content.findall("planet")
    star_name = content.findall("star")
    if planet_name:
        for planet in planet_name:
             planet_list.append(Planet(planet[0].text, planet[1].text, etc)
    elif star_name:
        for star in star_name:
            planet_list.append(Planet(star[0].text, star[1].text, etc)
    else:
        print("Nothing")

這是一種遍歷該數據結構的簡單方法。 為了使代碼保持獨立,我直接從字符串而不是從文件讀取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"
        }
    ]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM