2017-04-17 35 views
0

我想從ElementTree Python中的簽名XML中讀取Signature,SignatureValue和SignedInfo,但它讀取爲None。 其他XML屬性讀取正常。我如何閱讀Signature,SignatureValue和SignedInfo?Python elementtree查找函數讀取簽名爲空(無)

這裏是我的代碼片段:

xml_file = open(settings.STATIC_ROOT + '/file/test.xml', 'rt').read() 
response_xml = xml_et.fromstring(xml_file.encode('utf-8')) 
print response_xml.find('Signature') # prints None 
print response_xml.find('SignatureValue') # prints None 
print response_xml.find('SignedInfo') # prints None 
print response_xml.find('OrderID').text # works fine 

這裏是我的測試XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Message date="08/09/2016 06:47:20"> 
    <Version>1.0</Version> 
    <OrderID>ABCD:123456</OrderID> 
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     <SignedInfo> 
     <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> 
     <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> 
     <Reference URI=""> 
      <Transforms> 
       <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> 
       <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> 
      </Transforms> 
      <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> 
      <DigestValue>blabla=</DigestValue> 
     </Reference> 
     </SignedInfo> 
     <SignatureValue>blabla==</SignatureValue> 
     <KeyInfo> 
     <KeyName>Public key of certificate</KeyName> 
     <KeyValue> 
      <RSAKeyValue> 
       <Modulus>blabla==</Modulus> 
       <Exponent>AQAB</Exponent> 
      </RSAKeyValue> 
     </KeyValue> 
     <X509Data> 
      <X509Certificate>blabla</X509Certificate> 
     </X509Data> 
     </KeyInfo> 
    </Signature> 
</Message> 

回答

1

它,因爲你有簽名元素的命名空間, 你可以做的是找到命名空間中的元素

print response_xml.find('{http://www.w3.org/2000/09/xmldsig#}Signature') 

那麼你將不得不採取簽名elem耳鼻喉科找到它所有的子元素

是這樣的:

namespace = "{http://www.w3.org/2000/09/xmldsig#}" 
signature_elem = response_xml.find(namespace +'Signature') 
print signature_elem 
print signature_elem.find(namespace+'SignatureValue') 
print signature_elem.find(namespace+'SignedInfo')