2016-07-07 4 views
2

Ответы были даны сотни раз, но все же я не мог найти решение. Я пробовал официальную документацию и ответы на stackoverflow.Анализ XML в Python с использованием ElementTree

У меня есть, что 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 простым и, но это оказалось слишком сложным для меня.

ответ

2

Вам нужен 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>] 
+0

Вот что мне нужно! – user3041764

+0

Не беспокойтесь, вы могли бы также «xm.findall ('.// ​​{x-schema: OpenShipments.xdr} TrackingNumber')', но это было бы неплохо, если бы вы использовали несколько узлов в вашем запросе xpath –

+0

, почему простой 'findall ('TrackingNumber') 'не работает? – user3041764

Смежные вопросы