Saya butuh bantuan dengan iterasi. Akar saya di XML adalah sdnEntry. Jika saya menggunakan [0] tanpa iterasi apa pun di dokumen, saya dapat mengambil nilai teks darinya, tetapi ketika saya melakukan loop saya menerima kesalahan seperti "last_names = sdns.getElementsByTagName("lastName"). Objek 'NodeList' tidak memiliki atribut 'getElementsByTagName'"

Kode kerja saya - tanpa iterasi apa pun terlihat seperti ini:

from xml.dom import minidom
xmldoc = minidom.parse("/Users/cohen/Documents/project/sdn.xml")
sdns = xmldoc.getElementsByTagName("sdnEntry")[0]
last_names = sdns.getElementsByTagName("lastName")[0]
ln = last_names.firstChild.data
types = sdns.getElementsByTagName("sdnType")[0]
t = types.firstChild.data


programs = sdns.getElementsByTagName("programList")[0] #program.firstChild.data
s = programs.getElementsByTagName("program")[0].firstChild.data
akas = sdns.getElementsByTagName("akaList")[0] #child lastName.fourthChild.data
a = akas.getElementsByTagName("aka")[0]
a1 = a.getElementsByTagName("lastName")[0].firstChild.data

addresses = sdns.getElementsByTagName("addressList")[0]
ad1 = addresses.getElementsByTagName("address")[0]
ad2 = ad1.getElementsByTagName("city")[0]
city= ad2.firstChild.data
ad3 = ad1.getElementsByTagName("country")[0]
country = ad3.firstChild.data

Ini adalah tampilannya seperti XML saya:

<sdnEntry>
    <uid>36</uid>
    <lastName>AEROCARIBBEAN AIRLINES</lastName>
    <sdnType>Entity</sdnType>
    <programList>
      <program>CUBA</program>
    </programList>
    <akaList>
      <aka>
        <uid>12</uid>
        <type>a.k.a.</type>
        <category>strong</category>
        <lastName>AERO-CARIBBEAN</lastName>
      </aka>
    </akaList>
    <addressList>
      <address>
        <uid>25</uid>
        <city>Havana</city>
        <country>Cuba</country>
      </address>
    </addressList>
  </sdnEntry>

Di bawah ini adalah for loop saya. Mohon saran. Terima kasih sebelumnya!

for sdn in sdns:
    for ln in last_names:
        print(ln)
        for t in types:
            print(t)
            for program in programs:
                print (s)
                for aka in akas:
                    print(a1)
                    for address in addresses:
                        print(city)
                        print(country)

Saya perlu menyimpan setiap sdnEntry di DB saya, oleh karena itu saya perlu untuk setiap entri hanya mengetahui

  • <name> (lastName AEROCARIBBEAN AIRLINES),
  • <sdnType> (Entitas)`,
  • <programs> dari daftar program mis. (program CUBA) tetapi bisa lebih,
  • <aka><lastName> (AERO-KARIBBE) semuanya
  • <address> semuanya (kota Havana negara Kuba )

Bagaimana saya bisa melakukannya?

0
Cohen 14 Agustus 2017, 22:44

2 jawaban

Jawaban Terbaik
from xml.etree import ElementTree

# I included this list to help
all_nodes = ['sdnEntry', 'uid', 'lastName', 'sdnType', 'programList', 'program', 'akaList',
             'aka', 'uid', 'type', 'category', 'lastName', 'addressList', 'address', 'uid',
             'city', 'country']

required_nodes = ['lastName', 'uid', 'program', 'type', 'category', 'city', 'country']

# required because some names are repeated uid, last
keys = ['sdnEntry_uid', 'lastName', 'program', 'aka_uid', 'type', 'category', 'aka_lastName',
        'address_uid', 'city', 'country']

sdn_data = {}
index = 0

with open('stuff.xml', 'r') as xml_file:
    tree = ElementTree.parse(xml_file)

# iterate all nodes
for node in tree.iter():
    # check if a required node
    if node.tag in required_nodes:
        # add to dictionary
        sdn_data[keys[index]] = node.text
        index += 1

# Use this to test
for key, value in sdn_data.items():
    print(key, value)

keluaran
sdnEntry_uid 36
nama belakang AEROCARIBBEAN AIRLINES
program KUBA
alias_uid 12
ketik alias
kategori kuat
alias_lastName AERO-CARIBBEAN
address_uid 25
kota Havana
negara Kuba

1
diek 15 Agustus 2017, 15:18

Sebenarnya bukan jawaban, tapi bolehkah saya menyarankan untuk mencoba xmltodict. API jauh lebih mudah untuk ditangani dengan IMO, dan jika Anda melakukan kesalahan, mereka pasti akan kurang samar (yaitu - karena payload hasil penuh hanyalah dict python, mudah untuk melihat dan melihat ke mana hal-hal mungkin telah pergi salah).

0
MrName 14 Agustus 2017, 21:09