第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Python 高效地從 XML 中提取嵌套元素

Python 高效地從 XML 中提取嵌套元素

慕斯709654 2024-01-16 10:46:32
我正在嘗試解析大量包含大量嵌套元素的 XML 文件,以收集稍后使用的特定信息。由于文件數(shù)量巨大,我試圖盡可能高效地完成此操作,以減少處理時(shí)間。我可以使用 xpath 提取所需的信息,如下所示,但似乎效率很低。特別是必須運(yùn)行第二個(gè) for 循環(huán)來(lái)使用另一個(gè) xpath 搜索提取結(jié)果值。我可以使用更有效的方法來(lái)獲得下面所需的輸出嗎?我可以通過(guò)單個(gè) xpath 查詢收集所需的信息嗎?所需的解析格式:Id? ? ? ? ? ? ?Object? ? Type? ? ? ? ? ? ?ResultPackages? ? ? ?total? ? ?totalPackages? ? 1200DeliveryMethod priority? packagesSent? ? ?100DeliveryMethod express? ?packagesSent? ? ?200DeliveryMethod ground? ? packagesSent? ? ?300DeliveryMethod priority? packagesReceived 100DeliveryMethod express? ?packagesReceived 200DeliveryMethod ground? ? packagesReceived 300XML 示例:<?xml version="1.0" encoding="utf-8"?>? ? <Data>? ? ? ? <Location localDn="Chicago"/>? ? ? ? <Info Id="Packages">? ? ? ? ? ? <job jobId="1"/>? ? ? ? ? ? <Type pos="1">totalPackages</Type>? ? ? ? ? ? <Value Object="total">? ? ? ? ? ? ? ? <result pos="1">1200</result>? ? ? ? ? ? </Value>? ? ? ? </Info>? ? ? ? <Info Id="DeliveryMethod">? ? ? ? ? ? <job jobId="1"/>? ? ? ? ? ? <Type pos="1">packagesSent</Type>? ? ? ? ? ? <Type pos="2">packagesReceived</Type>? ? ? ? ? ? <Value Object="priority">? ? ? ? ? ? ? ? <result pos="1">100</result>? ? ? ? ? ? ? ? <result pos="2">100</result>? ? ? ? ? ? </Value>? ? ? ? ? ? <Value Object="express">? ? ? ? ? ? ? ? <result pos="1">200</result>? ? ? ? ? ? ? ? <result pos="2">200</result>? ? ? ? ? ? </Value>? ? ? ? ? ? <Value Object="ground">? ? ? ? ? ? ? ? <result pos="1">300</result>? ? ? ? ? ? ? ? <result pos="2">300</result>? ? ? ? ? ? </Value>? ? ? ? </Info>? </Data>是否可以通過(guò)迭代來(lái)獲取所有信息tree.xpath('//*')?
查看完整描述

2 回答

?
慕村225694

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


查看完整回答
反對(duì) 回復(fù) 2024-01-16
?
茅侃侃

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


查看完整回答
反對(duì) 回復(fù) 2024-01-16
  • 2 回答
  • 0 關(guān)注
  • 184 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)