2016-07-07 7 views
2

Die Antworten wurden Hunderte von Malen gegeben, aber ich konnte immer noch keine Lösung finden. Ich habe die offizielle Dokumentation und Antworten auf stackoverflow ausprobiert.Parsing XML in Python mit ElementTree

Ich habe, dass die XML-Struktur:

<?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> 

Eine Notwendigkeit, "Tracking" Wert zu erhalten. Ich versuchte findall() und find() Funktionen, aber ohne Ergebnis.

ElementTree musste den Zugriff auf XML-Elemente vereinfachen, aber das erwies sich als zu schwierig für mich.

Antwort

2

Sie benötigen einen namespace Mapping:

[<Element '{x-schema:OpenShipments.xdr}TrackingNumber' at 0x7fa210579550>, <Element '{x-schema:OpenShipments.xdr}TrackingNumber' at 0x7fa210579910>] 
+0

Das ist, was ich brauche:

from xml.etree import ElementTree as et xm = et.fromstring(x) ns = {"op": 'x-schema:OpenShipments.xdr'} print(xm.findall('.//op:TrackingNumber',ns)) 

, die Sie so etwas wie geben! – user3041764

+0

Keine Sorge, Sie könnten auch 'xm.findall ('.// ​​{x-schema: OpenShipments.xdr} TrackingNumber')' aber das würde schön werden, wenn Sie mehrere Knoten in Ihrer Xpath-Abfrage verwenden würden –

+0

warum einfach 'findall ('TrackingNumber') 'funktioniert nicht? – user3041764