答案已经给出了数百次,但我仍然找不到解决方案。我尝试了 stackoverflow 上的官方文档和答案。
我有 XML 结构:
<?xml version="1.0" encoding="windows-1252"?>
<OpenShipments xmlns="x-schema:OpenShipments.xdr">
<OpenShipment ProcessStatus="Processed" ShipmentOption="">
<ShipTo>
<CompanyOrName><![CDATA[xxx]]></CompanyOrName>
<Attention><![CDATA[xxx]]></Attention>
<Address1><![CDATA[xxx]]></Address1>
<PostalCode><![CDATA[xxx]]></PostalCode>
<CityOrTown><![CDATA[xxx]]></CityOrTown>
<Telephone><![CDATA[xxx]]></Telephone>
<EmailAddress><![CDATA[xxx]]></EmailAddress>
<CountryTerritory><![CDATA[xxx]]></CountryTerritory>
</ShipTo>
<ShipmentInformation>
<ServiceType>ST</ServiceType>
<PackageType>CP</PackageType>
<ShipmentActualWeight><![CDATA[XXX]]></ShipmentActualWeight>
<QVNOption>
<QVNRecipientAndNotificationTypes>
<CompanyOrName/>
<ContactName/>
<EMailAddress/>
<LabelCreation/>
</QVNRecipientAndNotificationTypes>
<ShipFromCompanyOrName>xxx</ShipFromCompanyOrName>
</QVNOption>
</ShipmentInformation>
<ProcessMessage>
<ShipmentRates>
<ShipmentCharges>
<Rate>
<Published>XXX</Published>
<Negotiated>XXX</Negotiated>
</Rate>
</ShipmentCharges>
<ShipperCharges>
<Rate>
<Published>XXX</Published>
<Negotiated>XXX</Negotiated>
</Rate>
</ShipperCharges>
<ReceiverCharges>
<Rate>
<Published>0,00</Published>
<Negotiated>0,00</Negotiated>
</Rate>
</ReceiverCharges>
<QVN>
<Rate>
<Published>0,00</Published>
<Negotiated>0,00</Negotiated>
</Rate>
</QVN>
<PackageRates>
<PackageRate>
<TrackingNumber>TRACKING NUMBER</TrackingNumber>
<PackageCharges>
<Rate>
<Published>0,00</Published>
<Negotiated>0,00</Negotiated>
</Rate>
</PackageCharges>
<Delivery_AreaSurcharge>
<Rate>
<Published>0,00</Published>
<Negotiated>0,00</Negotiated>
</Rate>
</Delivery_AreaSurcharge>
</PackageRate>
</PackageRates>
</ShipmentRates>
<TrackingNumbers>
<TrackingNumber>TRACKING NUMBER</TrackingNumber>
</TrackingNumbers>
<ShipID>XXX</ShipID>
<ImportID></ImportID>
<Reference1></Reference1>
<Reference2></Reference2>
<ShipmentID></ShipmentID>
<PRONumber></PRONumber>
</ProcessMessage>
</OpenShipment>
</OpenShipments>
需要获取“TrackingNumber”值。我尝试了 findall()
和 find()
函数,但没有结果。
import xml.etree.ElementTree as ET
import pprint
tree = ET.parse('file.out')
root = tree.getroot()
print root.findall('TrackingNumber')
# []
print root.find('TrackingNumber')
# None
ElementTree 必须使对 XML 元素的访问变得简单,但这对我来说太困难了。
最佳答案
您需要一个namespace映射:
from xml.etree import ElementTree as et
xm = et.fromstring(x)
ns = {"op": 'x-schema:OpenShipments.xdr'}
print(xm.findall('.//op:TrackingNumber',ns))
这会给你类似的东西:
[<Element '{x-schema:OpenShipments.xdr}TrackingNumber' at 0x7fa210579550>, <Element '{x-schema:OpenShipments.xdr}TrackingNumber' at 0x7fa210579910>]
关于python - 使用 ElementTree 在 Python 中解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38241841/