如何使用python将xml属性值与列表进行比较

时间:2019-05-21 21:18:39

标签: python xml-parsing elementtree

我正在尝试将xml属性的值与预定义列表进行比较。我只想检索与产品列表中存在的项目相对应的 id order_num

我的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结束的过程

0 个答案:

没有答案