有没有办法从XML中根据关键字提取数据?

Is there a way to extract data based on keyword from XML?

提问人:iced 提问时间:11/4/2022 最后编辑:iced 更新时间:11/5/2022 访问量:79

问:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<Catalog>
   <CatalogItemLine>
     <NameValue name="Car_id">111-2020-3</NameValue>
     <NameValue name="Car Name">Honda Accord</NameValue>
     <NameValue name="Price at location 98134">40000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">30</NameValue>
     <NameValue name="color">blue</NameValue>
     <NameValue name="door">4</NameValue>
     
   </CatalogItemLine>
   <CatalogItemLine>
     <NameValue name="Car_id">121-2020-3</NameValue>
     <NameValue name="Car Name">Honda Civic</NameValue>
     <NameValue name="Price at location 98134">30000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">35</NameValue>
     <NameValue name="color">white</NameValue>
     <NameValue name="door">2</NameValue>
   </CatalogItemLine>
   <CatalogItemLine>
     <NameValue name="Car_id">131-2020-3</NameValue>
     <NameValue name="Car Name">Toyota Camry</NameValue>
     <NameValue name="Price at location 98134">45000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">32</NameValue>
     <NameValue name="color">black</NameValue>
     <NameValue name="door">4</NameValue>
   </CatalogItemLine>
   <CatalogItemLine>
     <NameValue name="Car_id">151-2020-3</NameValue>
     <NameValue name="Car Name">Honda Pilot</NameValue>
     <NameValue name="Price at location 98134">50000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">30</NameValue>
     <NameValue name="color">gray</NameValue>
     <NameValue name="door">4</NameValue>
   </CatalogItemLine>
   <CatalogItemLine>
     <NameValue name="Car_id">101-2020-3</NameValue>
     <NameValue name="Car Name">Chevy Malibu</NameValue>
     <NameValue name="Price at location 98134">40000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">30</NameValue>
     <NameValue name="color">white</NameValue>
     <NameValue name="door">4</NameValue>
   </CatalogItemLine>
</Catalog>  

我正在尝试获取xml文件中包含关键字“Honda”的数据。 只尝试获取(Car_id、车名、位置 98134、Mpg 的价格)。我想得到的输出是:

**Car_id
111-2020-3
Car Name
Honda Accord
Price at location 98134
40000
Mpg
30

Car_id
121-2020-3
Car Name
Honda Civic
Price at location 98134
30000
Mpg
35

Car_id
151-2020-3
Car Name
Honda Pilot
Price at location 98134
50000
Mpg
30**

法典:

import xml.etree.ElementTree as ET

xmlfile= ('cardata.xml')


tree = ET.parse(xmlfile)
root = tree.getroot()

    for CatalogItemLine in root.findall('.//CatalogItemLine'):
        if CatalogItemLine.find('NameValue') is not None:
           NameValue = CatalogItemLine.find('NameValue')
           if NameValue.text is not None:
               if "Honda" in NameValue.text:
                   print(CatalogItemLine.find('NameValue').text)

我无法获得输出,我刚刚开始学习和使用 python 和 XML。

我正在尝试获取xml文件中包含关键字“Honda”的数据。

仅尝试获取以下数据(Car_id、汽车名称、位置 98134 的价格、Mpg)。

非常感谢您的帮助。

python xml xml 解析 elementtree

评论

0赞 LMC 11/5/2022
stackoverflow.com/a/12293187/2834978
0赞 gre_gor 11/5/2022
为什么要循环使用文件名?
0赞 Community 11/5/2022
请澄清您的具体问题或提供其他详细信息,以准确说明您的需求。正如目前所写的那样,很难确切地说出你在问什么。
0赞 iced 11/5/2022
@mzjn所有标签都在那里:<Catalog> <CatalogItemLine><NameValue></NameValue></CatalogItemLine></Catalog>
0赞 iced 11/5/2022
@mzjn对不起,我刚刚更新了xml。你能帮我输出吗?

答:

0赞 balderman 11/5/2022 #1

请尝试以下操作

import xml.etree.ElementTree as ET

xml = '''<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<Catalog>
   <CatalogItemLine>
     <NameValue name="Car_id">111-2020-3</NameValue>
     <NameValue name="Car Name">Honda Accord</NameValue>
     <NameValue name="Price at location 98134">40000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">30</NameValue>
     <NameValue name="color">blue</NameValue>
     <NameValue name="door">4</NameValue>
     
   </CatalogItemLine>
   <CatalogItemLine>
     <NameValue name="Car_id">121-2020-3</NameValue>
     <NameValue name="Car Name">Honda Civic</NameValue>
     <NameValue name="Price at location 98134">30000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">35</NameValue>
     <NameValue name="color">white</NameValue>
     <NameValue name="door">2</NameValue>
   </CatalogItemLine>
   <CatalogItemLine>
     <NameValue name="Car_id">131-2020-3</NameValue>
     <NameValue name="Car Name">Toyota Camry</NameValue>
     <NameValue name="Price at location 98134">45000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">32</NameValue>
     <NameValue name="color">black</NameValue>
     <NameValue name="door">4</NameValue>
   </CatalogItemLine>
   <CatalogItemLine>
     <NameValue name="Car_id">151-2020-3</NameValue>
     <NameValue name="Car Name">Honda Pilot</NameValue>
     <NameValue name="Price at location 98134">50000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">30</NameValue>
     <NameValue name="color">gray</NameValue>
     <NameValue name="door">4</NameValue>
   </CatalogItemLine>
   <CatalogItemLine>
     <NameValue name="Car_id">101-2020-3</NameValue>
     <NameValue name="Car Name">Chevy Malibu</NameValue>
     <NameValue name="Price at location 98134">40000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">30</NameValue>
     <NameValue name="color">white</NameValue>
     <NameValue name="door">4</NameValue>
   </CatalogItemLine>
</Catalog>  '''
properties = ['Car_id', 'Car Name', 'Price at location 98134', 'Mpg']
root = ET.fromstring(xml)
data = []
for cil in root.findall('.//CatalogItemLine'):
    nv = cil.find('NameValue[@name="Car Name"]')
    if 'honda' in nv.text.lower():
        entry = {}
        for p in properties:
            entry[p] = cil.find(f'NameValue[@name="{p}"]').text
        data.append(entry)
for entry in data:
    print(entry)

输出

{'Car_id': '111-2020-3', 'Car Name': 'Honda Accord', 'Price at location 98134': '40000', 'Mpg': '30'}
{'Car_id': '121-2020-3', 'Car Name': 'Honda Civic', 'Price at location 98134': '30000', 'Mpg': '35'}
{'Car_id': '151-2020-3', 'Car Name': 'Honda Pilot', 'Price at location 98134': '50000', 'Mpg': '30'}

评论

0赞 iced 11/5/2022
感谢您的解决方案,非常感谢您的帮助,我有一个疑问,我有多个XML文件,其中包含的数据方式是(文件“c1.xml”包含本田雅阁的数据,文件“c2.xml”包含本田思域的数据,文件“c3.xml”包含丰田凯美瑞的数据,文件“c4.xml”包含本田飞行员的数据)。我的代码正在读取这些文件,但问题是它从最后一个文件“C4.xml”中抓取数据。我希望它应该从包含“本田”的所有文件中获取数据。
0赞 balderman 11/5/2022
因此,您需要遍历文件列表并从每个文件中获取本田。无论如何 - 在您的问题中,您没有提到多个文件,所以我的回答很好地涵盖了您的问题。请接受答案。