python - 使用 ElementTree 在 Python 中解析 XML

标签 python xml elementtree

答案已经给出了数百次,但我仍然找不到解决方案。我尝试了 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/

相关文章:

python - 如何在 PySpark 中使用窗口函数?

python - sklearn随机森林索引feature_importances_如何做

javascript - JavaScript 中的 XML 文字?

python - 外派错误 : no element found - Python script

python - 如何在 Python 中将带有变量的列表分配给变量

python - Pip 在 Windows 10 上安装 Spyder(无法启动)

java - 将类似的 xml 文件与带有无序标签的 XmlUnit 进行比较(具有不同属性的相同标签名称)

java - 如何查找另一个标签之前最后一次出现的 XML 标签

python - 在Python中用正则表达式替换多个字符串,以获取截断字符串的文件

python - 为什么 ElementTree 吃/忽略命名空间(在属性值中)?