2 回答

TA貢獻1880條經驗 獲得超4個贊
其中一項優化不會像您現在使用tree.xpath('//*')if 語句那樣遍歷所有標簽并進行檢查。這可以替換為tree.xpath('//Type')
接下來需要優化的是迭代值。Value您無需一遍又一遍地迭代( tree.xpath('//Value')),您可以獲得標簽的所有同級Values標簽Typeelem.xpath('./following-sibling::Value')
from lxml import etree
xml_file = open('stack_sample.xml')
tree = etree.parse(xml_file)
root = tree.getroot()
for elem in tree.xpath('//Type'):
_id = elem.getparent().attrib["Id"]
_type = elem.text
_position = elem.attrib["pos"]
values = elem.xpath('./following-sibling::Value')
for value in values:
_object = value.attrib['Object']
_result = value.xpath(f'./result[@pos={_position}]/text()')[0]
print(_id, _type, _object, _result)
這將打印出:
Packages totalPackages total 1200
DeliveryMethod packagesSent priority 100
DeliveryMethod packagesSent express 200
DeliveryMethod packagesSent ground 300
DeliveryMethod packagesReceived priority 100
DeliveryMethod packagesReceived express 200
DeliveryMethod packagesReceived ground 300
編輯
這是針對特定情況的解決方案,其中我們確定resultinValue標簽的數量等于與其他解決方案Type是同級的標簽的數量Value,另外解決方案假設Type和result按相同pos屬性排序。
請記住,這是一種非常具體的解決方案,而不是通用的解決方案。
from lxml import etree
xml_file = open('stack_sample.xml')
tree = etree.parse(xml_file)
root = tree.getroot()
for elem in tree.xpath('//Type'):
_id = elem.getparent().attrib["Id"]
_type = elem.text
_objects = elem.xpath('./following-sibling::Value/@Object')
_results = elem.xpath('./following-sibling::Value/result/text()')
for _object, _result in zip(_objects, _results):
print(_id, _type, _object, _result)
輸出:
Packages totalPackages total 1200
DeliveryMethod packagesSent priority 100
DeliveryMethod packagesSent express 100
DeliveryMethod packagesSent ground 200
DeliveryMethod packagesReceived priority 100
DeliveryMethod packagesReceived express 100
DeliveryMethod packagesReceived ground 200

TA貢獻1842條經驗 獲得超21個贊
//*如果您不迭代所有標簽( ),而只是迭代,也許性能會更高<Value>:
from lxml import etree
xml_file = open('stack_sample.xml')
tree = etree.parse(xml_file)
root = tree.getroot()
for val in tree.xpath('//Value'):
t = {t.get('pos'): t.text for t in val.getparent().xpath('./Type')}
for r in val.xpath('./result'):
print(val.getparent().get('Id'), val.get('Object'), t[r.get('pos')], r.text)
印刷:
Packages total totalPackages 1200
DeliveryMethod priority packagesSent 100
DeliveryMethod priority packagesReceived 100
DeliveryMethod express packagesSent 200
DeliveryMethod express packagesReceived 200
DeliveryMethod ground packagesSent 300
DeliveryMethod ground packagesReceived 300
添加回答
舉報