2013-06-28 190 views
0

我有下面的XML:解析XML與LXML和Python

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <LogonResponse xmlns="http://schemas.navitaire.com/ClientServices/Common/SessionManagerClient"> 
     <LogonResult> 
     <LastName xmlns="http://schemas.navitaire.com/Messages/Session/Response">Mont</LastName> 
     <FirstName xmlns="http://schemas.navitaire.com/Messages/Session/Response">Paul</FirstName> 
     <PersonID xmlns="http://schemas.navitaire.com/Messages/Session/Response">123</PersonID> 
     <CultureCode xmlns="http://schemas.navitaire.com/Messages/Session/Response">en-US</CultureCode> 
     <CurrencyCode xmlns="http://schemas.navitaire.com/Messages/Session/Response">Dollar</CurrencyCode> 
     <LastLogon xmlns="http://schemas.navitaire.com/Messages/Session/Response">0001-01-01T00:00:00</LastLogon> 
     <SessionContext xmlns="http://schemas.navitaire.com/Common"> 
      <SessionControl>OneOnly</SessionControl> 
      <SystemType>Default</SystemType> 
      <SessionID>0</SessionID> 
      <SequenceNumber>0</SequenceNumber> 
      <MessageVersion>0</MessageVersion> 
      <Signature>00000000-0000-0000-0000-000000000000</Signature> 
      <ChannelType>Default</ChannelType> 
      <InTransaction>false</InTransaction> 
      <TransactionDepth>0</TransactionDepth> 
      <TransactionCount>0</TransactionCount> 
      <SecureToken>kFBOdZGqP6s=|/TftALE31236mSppQoFpArBizzz=</SecureToken> 
     </SessionContext> 
     </LogonResult> 
    </LogonResponse> 
    </s:Body> 
</s:Envelope> 

的想法是搶SecureToken,簽名和MessageVersion到變量,我嘗試使用下面的代碼:

SecureToken = tree.find('.//SecureToken').text 

但沒有運氣,我需要使用所有的命名空間或其他東西來實現這一目標?

請記住,此XML是來自請求的返回,我無法對其進行編輯。

+0

總之,是的,你需要用標籤指定名稱空間。看到你的選擇鏈接的欺騙。 –

+0

另請參閱[使用Python ElementTree中的命名空間解析XML](http://stackoverflow.com/a/14853417) –

回答

1

如果你想避免處理的命名空間完全,你可以做類似

tree.xpath("//*[local-name() = 'SecureToken']")[0].text 

這將解決這個特定的問題,而是有其自身的侷限性,在大多數情況下,我寧願去了稍微冗長的名稱空間感知搜索。