2015-01-20 87 views
1

是否可以使用lxml構造一個XML作爲這個XML?lxml - 具有多個名稱空間的XML文檔

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns0="http://xmlns.CLT.com/consume/ENTBUS" xmlns:ns1="http://xmlns.CLT.com/Core/ENTBUS" xmlns:ns2="http://xmlns.CLT.com/output/EBO"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <ns0:ConsumptionRequestENTBUS> 
     <ns1:ENTBUSHeader> 
      <ns1:ENTBUSID>1</ns1:ENTBUSID> 
     </ns1:ENTBUSHeader> 
     <ns0:Zone> 
      <ns2:Consumption> 
       <ns2:BusCode>1</ns2:BusCode> 
      </ns2:Consumption> 
     </ns0:Zone> 
     </ns0:ConsumptionRequestENTBUS> 
    </soapenv:Body> 
</soapenv:Envelope> 

我試着構建如下的根元素,但失敗了。幾乎每個元素都需要被命名空間引用。

>>> from lxml import etree 
>>> root = etree.Element("soapenv:Envelope") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "lxml.etree.pyx", line 2811, in lxml.etree.Element (src\lxml\lxml.etree.c:65389) 
    File "apihelpers.pxi", line 103, in lxml.etree._makeElement (src\lxml\lxml.etree.c:13898) 
    File "apihelpers.pxi", line 1575, in lxml.etree._tagValidOrRaise (src\lxml\lxml.etree.c:27955) 
ValueError: Invalid tag name u'soapenv:Envelope' 

感謝

回答

1

我能以下面的方式解決這個問題。任何建議,使這個更好,是最受歡迎的。

>>> from lxml import etree 
>>> SOAPENV_NAMESPACE = "http://schemas.xmlsoap.org/soap/envelope" 
>>> SOAPENV = "{%s}" % SOAPENV_NAMESPACE 
>>> ns0_NAMESPACE = "http://xmlns.CLT.com/consume/ENTBUS" 
>>> ns0 = "{%s}" % ns0_NAMESPACE 
>>> ns1_NAMESPACE = "http://xmlns.CLT.com/Core/ENTBUS" 
>>> ns1 = "{%s}" % ns1_NAMESPACE 
>>> ns2_NAMESPACE = "http://xmlns.CLT.com/output/EBO" 
>>> ns2 = "{%s}" % ns2_NAMESPACE 
>>> NSMAP = {'SoapEnv' : SOAPENV_NAMESPACE,'ns0':ns0_NAMESPACE,'ns1':ns1_NAMESPACE,'ns2':ns2_NAMESPACE} 
>>> envelope = etree.Element(SOAPENV + "Envelope", nsmap=NSMAP) 
>>> ConsumptionRequestENTBUS=etree.SubElement(envelope, ns0 + "ConsumptionRequestENTBUS", nsmap=NSMAP) 
>>> ENTBUS=etree.SubElement(ConsumptionRequestENTBUS, ns1 + "ENTBUS", nsmap=NSMAP) 
>>> ENTBUSHeader=etree.SubElement(ENTBUS, ns1 + "ENTBUSHeader", nsmap=NSMAP) 
>>> ENTBUSDetail=etree.SubElement(ENTBUSHeader, ns2 + "ENTBUSDetail", nsmap=NSMAP) 
>>> print(etree.tostring(envelope, pretty_print=True)) 
<SoapEnv:Envelope xmlns:ns0="http://xmlns.CLT.com/consume/ENTBUS" xmlns:ns1="http://xmlns.CLT.com/Core/ENTBUS" xmlns:ns2="h 
ttp://xmlns.CLT.com/output/EBO" xmlns:SoapEnv="http://schemas.xmlsoap.org/soap/envelope"> 
    <ns0:ConsumptionRequestENTBUS> 
    <ns1:ENTBUS> 
     <ns1:ENTBUSHeader> 
     <ns2:ENTBUSDetail/> 
     </ns1:ENTBUSHeader> 
    </ns1:ENTBUS> 
    </ns0:ConsumptionRequestENTBUS> 
</SoapEnv:Envelope> 
0

的LXML教程並有namespaces的部分。但是,如果您實際上正在使用SOAP Web服務進行通信,那麼我建議儘可能使用像suds或soapbox這樣的適當庫。

+0

肥皂盒遠沒有完成。我是usig jurko-suds,它無法映射命名空間。所以我想用這種方式來構建請求。是否有可能幫助我1到1的泡沫問題? – Guddu 2015-01-20 21:12:44

相關問題