提问人:iced 提问时间:11/4/2022 最后编辑:iced 更新时间:11/5/2022 访问量:79
有没有办法从XML中根据关键字提取数据?
Is there a way to extract data based on keyword from 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>
我正在尝试获取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)。
非常感谢您的帮助。
答:
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
因此,您需要遍历文件列表并从每个文件中获取本田。无论如何 - 在您的问题中,您没有提到多个文件,所以我的回答很好地涵盖了您的问题。请接受答案。
评论