2 回答

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊
其中一項(xiàng)優(yōu)化不會(huì)像您現(xiàn)在使用tree.xpath('//*')if 語(yǔ)句那樣遍歷所有標(biāo)簽并進(jìn)行檢查。這可以替換為tree.xpath('//Type')
接下來(lái)需要優(yōu)化的是迭代值。Value您無(wú)需一遍又一遍地迭代( tree.xpath('//Value')),您可以獲得標(biāo)簽的所有同級(jí)Values標(biāo)簽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
編輯
這是針對(duì)特定情況的解決方案,其中我們確定resultinValue標(biāo)簽的數(shù)量等于與其他解決方案Type是同級(jí)的標(biāo)簽的數(shù)量Value,另外解決方案假設(shè)Type和result按相同pos屬性排序。
請(qǐng)記住,這是一種非常具體的解決方案,而不是通用的解決方案。
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貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊
//*如果您不迭代所有標(biāo)簽( ),而只是迭代,也許性能會(huì)更高<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
添加回答
舉報(bào)