Как сравнить значения атрибутов xml со списком с python - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь сравнить значение атрибута xml с предопределенным списком.Я только хочу получить id и order_num , которые соответствуют элементу, который присутствует в моем списке products .

Мой XML:

<top_root>  
    <top_field name="id" cust_id="205C1534" location_id="LA15454" account_id="199911">    
        <top_group id="921">      
            <top_item id="274" order_num="1X234TTB2"></top_item>         
            <top_item id="211" order_num="1X234TTB2"></top_item>      
            <top_item id="214" order_num="1X234TTB2"></top_item>      
        </top_group>  
    </top_field>  
    <top_field name="id" cust_id="202C1214" location_id="LA12424" account_id="199911">    
        <top_group id="914">      
            <top_item id="227" order_num="1X371TTM1"></top_item>      
            <top_item id="221" order_num="1X371TTM1"></top_item>      
            <top_item id="229" order_num="1X371TTM1"></top_item>      
        </top_group>  
    </top_field>  
    <top_field name="id" cust_id="202C1214" location_id="LA12424" account_id="199911">    
        <top_group id="814">      
            <top_item id="223" order_num="1X451TTA9"></top_item>      
            <top_item id="226" order_num="1X451TTA9"></top_item>      
            <top_item id="220" order_num="1X451TTA9"></top_item>      
        </top_group>    
        <top_group id="929">      
            <top_item id="929" order_num="1X461TTA6"></top_item>
        </top_group>  
    </top_field>  
</top_root>

Код Python:

from xml.etree import ElementTree  as ET

tree = ET.parse('xml_test_files/request.xml')
root = tree.getroot()
products = {"ITEM1": "914",
            "ITEM2": "288",
            "ITEM3": "255",
            "ITEM4": "218",
            "ITEM5": "921"
            }
for group in root.findall('./top_field/top_group'):
    order_num = []
    id = []
    if group.attrib['id'] in products.values:
        id.append(group.attrib['id'])
        for child in group:
            if child.tag == "top_item":
                order_num.append(child.attrib['order_num'])
        print(id)
        print(order_num)

Мои желаемые результаты:

['921']  
['1X234TTB2', '1X234TTB2', '1X234TTB2']  
['914']  
['1X371TTM1', '1X371TTM1', '1X371TTM1']

Попробуйте # 1: Выполнить как закодированныйвыше с условием if group.attrib['id'] in products.values: Я получаю эту ошибку:

if group.attrib['id'] in products.values:
TypeError: argument of type 'builtin_function_or_method' is not iterable

Попытка № 2: Я пробовал без условия if group.attrib['id'] in products.values:, и я получаю этот вывод:

['921']  
['1X234TTB2', '1X234TTB2', '1X234TTB2']  
['914']  
['1X371TTM1', '1X371TTM1', '1X371TTM1']  
['814']  
['1X451TTA9', '1X451TTA9', '1X451TTA9']  
['929']  
['1X461TTA6']  

Попробуйте #3: Когда я изменяю findall на iter и оставляю условие if group.attrib['id'] in products.values:, я больше не получаю сообщение об ошибке, но мой вывод пуст:

Процесс завершен скод выхода 0

...