从多个xml文件中查找一个特定的和的组合

时间:2018-02-02 12:45:48

标签: python xml loops combinations

我尝试找到一个由3个不同xml文件中的ID组成的特定总和。 总和将始终是唯一的,而不是xml文件中的其他3个元素值将累加到该总和。

我的xml文件如下所示:

水果档案:

...
-<Fruits>
<FruitID>1000</FruitID>
...
</Fruits>
...

原产国的文件:

...
-<Country>
<CountryID>2000</CountryID>
...
</Country>
...

公司档案:

...
-<Corporation>
<CorporationID>5000</CorporationID>
...   
</Corporation>
...

这是我的python代码:

import xml.etree.ElementTree as ET
import urllib.request as ur

url_fruits = 'fruits-url\fruits.xml'
url_countries = 'countries-url\countries.xml'
url_corporations = 'corporations-url\corporations.xml'

fp_fruits = ur.urlopen(url_fruits)
tree_fruits = ET.parse(fp_fruits)
fruits = tree_fruits.getroot()

fp_countries = ur.urlopen(url_countries)
tree_countries = ET.parse(fp_countries)
countries = tree_countries.getroot()

fp_domain = ur.urlopen(url_corporations)
tree_domain = ET.parse(fp_corporations)
corporations = tree_corporations.getroot()


result = None
ID_userinput = input('What ID should be translated to fruit id?')

if ID_userinput == '':
    pass
else:
    for child in (fruits,countries, corporations):
        if int(ID_userinput) == int((child.find('FruitID').text) + (child.find('CountryID').text) + (child.find('CorporationID').text):
            result = child.find('FruitID')
        else:
            pass

print(result)

这总会产生错误。 我没有找到任何正确的语法,可以同时迭代多个xml文件和所有可能的组合。 有解决方案吗?

谢谢和最诚挚的问候, 斯蒂芬

1 个答案:

答案 0 :(得分:0)

要了解这里发生了什么,让我们展开你的循环:

for child in (fruits,countries, corporations):
    if int(ID_userinput) == int((child.find('FruitID').text) + (child.find('CountryID').text) + (child.find('CorporationID').text):
        result = child.find('FruitID')
    else:
        pass

另外,摆脱无用的else,这给了我们:

if int(ID_userinput) == int((fruits.find('FruitID').text) + (fruits.find('CountryID').text) + (fruits.find('CorporationID').text):
    result = fruits.find('FruitID')
if int(ID_userinput) == int((countries.find('FruitID').text) + (countries.find('CountryID').text) + (countries.find('CorporationID').text):
    result = countries.find('FruitID')
if int(ID_userinput) == int((corporations.find('FruitID').text) + (corporations.find('CountryID').text) + (corporations.find('CorporationID').text):
    result = corporations.find('FruitID')

让我们看一下if语句中的第一个:

if int(ID_userinput) == int((fruits.find('FruitID').text) + (fruits.find('CountryID').text) + (fruits.find('CorporationID').text):

fruits.find('CountryID')会给你什么?您的水果文件是否包含国家ID?如果没有,这可以解释您获取None的原因(当您尝试访问.text时会出现错误)

您需要的是在每种类型的ID上嵌套循环。

类似的东西:

for fruit_id in fruits.iter('FruitID'):
    for country_id in countries.iter('CountryID'):
        for corporation_id in corporations.iter('CorporationID'):
            if int(ID_userinput) == int(fruit_id.text) + int(country_id.text) + int(corporation_id.text):
                result = fruit_id

还有很多方法可以进一步改进 - 例如,您可以在找到的第一个结果处退出所有这些循环,而不是迭代所有剩余的组合。