Python For Loop over XML
我需要一些迭代方面的帮助。我在XML中的根是sdentry。如果我在文档中使用[0]而不进行任何迭代,我可以从中检索文本值,但在执行循环时,我会收到类似“last_names=sdns.getElementsByTagName(“lastName”)。AttributeError:“NodeList”对象没有属性“getElementsByTagName” 我的工作代码-没有任何迭代如下所示:Python For Loop over XML,python,xml,Python,Xml,我需要一些迭代方面的帮助。我在XML中的根是sdentry。如果我在文档中使用[0]而不进行任何迭代,我可以从中检索文本值,但在执行循环时,我会收到类似“last_names=sdns.getElementsByTagName(“lastName”)。AttributeError:“NodeList”对象没有属性“getElementsByTagName” 我的工作代码-没有任何迭代如下所示: from xml.dom import minidom xmldoc = minidom.parse(
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
这就是我的XML的外观:
<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>
我需要在数据库中存储每个
sdentry
,因此我需要每个条目只知道
(加勒比航空公司的姓氏)
(实体)`
来自程序列表,例如(程序CUBA),但它们可以更多
(航空加勒比)所有这些
全部(古巴哈瓦那市)
我该怎么做呢?这不是一个真正的答案,但我建议试试看。该API更容易处理IMO,如果您确实遇到了错误,它们肯定不会那么神秘(也就是说,由于完整的结果负载只是一个python dict,因此很容易查看并发现哪里出了问题) 输出
SDentry\u uid 36
姓氏加勒比航空公司
古巴计划
又名uid 12
键入a.k.a.
类别强
aka_lastName航空加勒比
地址\u uid 25
哈瓦那市
古巴国家队谢谢!也许是因为他们看起来像列表,没有文本属性?谢谢你的回答!这是向前迈出的一步。我需要将每个SDNtry存储在我的数据库中,因此我需要每个条目只知道名称(lastName Aerocarbian AIRLINES),(sdnType实体),项目列表中的项目,例如(项目古巴),但它们可以更多,所有AKA(lastName AERO-Carbian)和所有地址(城市哈瓦那国家古巴),我如何做到这一点?谢谢你,迪克!更新的代码,它可以很容易地修改,以删除一个项目不需要上述逻辑应该工作,它是一个条目完成。在每个完整条目后将索引重置为0
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)
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)