2017-10-04 97 views
1

我是一個有點困惑與XML如何讀取XML和使用LXML

我的XML

<?xml version="1.0" encoding="UTF-8"?> 
<AirShoppingRS Version="16.2" xsi:schemaLocation="http://www.iata.org/IATA/EDIST AirShoppingRS.xsd" 
    xmlns="http://www.iata.org/IATA/EDIST" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Document/> 
    <Success/> 
    <ShoppingResponseID> 
     <ResponseID>2017-10-04T14:35:25.243504</ResponseID> 
    </ShoppingResponseID> 
    <OffersGroup> 
     <AirlineOffers> 
      <TotalOfferQuantity>297</TotalOfferQuantity> 
      <Owner>SU</Owner> 
      <AirlineOffer> 
       <OfferID Owner="SU">OFFER5</OfferID> 
       <TotalPrice> 
        <SimpleCurrencyPrice Code="RUB">36229</SimpleCurrencyPrice> 
       </TotalPrice> 
       <PricedOffer> 
        <OfferPrice OfferItemID="5"> 
         <RequestedDate> 
          <PriceDetail> 
           <TotalAmount> 
            <SimpleCurrencyPrice>36229</SimpleCurrencyPrice> 
           </TotalAmount> 
           <BaseAmount>33000</BaseAmount> 
           <Taxes> 
            <Total Code="RUB">3229</Total> 
           </Taxes> 
          </PriceDetail> 
         </RequestedDate> 
         <FareDetail> 
          <FareComponent> 
           <SegmentReference>SEG_SVOLED_1</SegmentReference> 
           <FareBasis> 
            <FareBasisCode> 
             <Code>DFOR</Code> 
            </FareBasisCode> 
           </FareBasis> 
          </FareComponent> 
         </FareDetail> 
        </OfferPrice> 
       </PricedOffer> 
      </AirlineOffer> 
     </AirlineOffers> 
    </OffersGroup> 
</AirShoppingRS> 

獲取信息,我怎麼能讀它,使用lxml庫從一個元素獲取文本。我嘗試這一個root = etree.fromstring(xml.content),然後我嘗試airline_offers = root.findall("AirlineOffer"),但什麼也沒得到。猜猜,我做錯了什麼。我在哪裏犯錯?我怎樣才能得到一個元素,然後從它的文本或屬性?

UPDATE:airline_offers = root.findall(".//AirlineOffer")回報沒有什麼太

+0

的可能的複製[ ElementTree findall()返回空列表](https://stackoverflow.com/questions/9112121/elementtree-findall-returning-empty-list) – Bernhard

+0

@Headmaster,你想閱讀所有的文字,你想要哪些標籤文字讀書 ? –

+0

@ChetanVasudevan'SimpleCurrencyPrice'標記例如 – Headmaster

回答

1

默認命名空間(http://www.iata.org/IATA/EDIST)是根元素上聲明。這是使它工作的一種方式:

airline_offers = root.findall(".//{http://www.iata.org/IATA/EDIST}AirlineOffer") 

也可以使用通配符:

airline_offers = root.findall(".//{*}AirlineOffer") 

另一種方法是定義一個前綴:

NS = {"edist": "http://www.iata.org/IATA/EDIST"} 
airline_offers = root.findall(".//edist:AirlineOffer", namespaces=NS)