2014-02-17 20 views
0

我有這樣使用lxml的生成XML文檔,具體費用根據元素文本和屬性的邏輯

from lxml import etree 
import sys 
fd = open('D:\\text.xml', 'wb') 
xmlns = "http://www.fpml.org/FpML-5/confirmation" 
xsi = "http://www.w3.org/2001/XMLSchema-instance" 
fpmlVersion="http://www.fpml.org/FpML-5/confirmation ../../fpml-main-5-6.xsd http://www.w3.org/2000/09/xmldsig# ../../xmldsig-core-schema.xsd" 
page = etree.Element("{"+xmlns+"}dataDocument",nsmap={None:xmlns,'xsi':xsi }) 
doc = etree.ElementTree(page) 
page.set("fpmlVersion", fpmlVersion) 
trade = etree.SubElement(page,'trade') 
tradeheader = etree.SubElement(trade,'tradeheader') 
partyTradeIdentifier = etree.SubElement(tradeheader,'partyTradeIdentifier') 
partyReference = etree.SubElement(partyTradeIdentifier,'partyReference',href='party1') 
tradeId = etree.SubElement(partyTradeIdentifier,'tradeId',tradeIdScheme='http://www.partyA.com/swaps/trade-id') 
tradeId.text = 'TW9235' 
swap = etree.SubElement(trade,'swap') 
party = etree.SubElement(page,'party',id='party1') 
partyID = etree.SubElement(party,'partyID') 
partyID.text = 'PARTYAUS33' 
partyName = etree.SubElement(party,'partyName') 
partyName.text = 'Party A' 
party = etree.SubElement(page,'party',id='party2') 
partyID = etree.SubElement(party,'partyID') 
partyID.text = 'BARCGB2L' 
partyName = etree.SubElement(party,'partyName') 
partyName.text = 'Party B' 
s = etree.tostring(doc, xml_declaration=True,encoding="UTF-8",pretty_print=True) 
print (s) 
fd.write(s) 

我lxml的代碼,我需要生成像

<?xml version='1.0' encoding='UTF-8'?> 
<dataDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.fpml.org/FpML-5/confirmation" fpmlVersion="http://www.fpml.org/FpML-5/confirmation ../../fpml-main-5-6.xsd http://www.w3.org/2000/09/xmldsig# ../../xmldsig-core-schema.xsd"> 
    <trade> 
    <tradeheader> 
     <partyTradeIdentifier> 
     <partyReference href="party1"/> 
     <tradeId tradeIdScheme="http://www.partyA.com/swaps/trade-id">TW9235</tradeId> 
     </partyTradeIdentifier> 
    </tradeheader> 
    <swap/> 
    </trade> 
    <party id="party1"> 
    <partyID>PARTYAUS33</partyID> 
    <partyName>Party A</partyName> 
    </party> 
    <party id="party2"> 
    <partyID>BARCGB2L</partyID> 
    <partyName>Party B</partyName> 
    </party> 
</dataDocument> 

一個XML文件,現在上面代碼有效。 但是我需要生成10k這樣的文件,其中的元素文本或屬性不同。 例如partyID可能不同於 PARTYGER45而不是PARTYUS33有沒有一種乾淨的方式來做到這一點,而不是硬編碼呢? 同樣地,我需要改變很多東西,像tradeId TW9235

回答

1

一種方式可能是有沒有加載到lxml objectify值輸出XML,然後循環,同時設置相關的值,並將其寫入到一個文件,這意味着

from lxml import objectify 
with open('in.xml') as f_in: 
    for pId in ['PARTYGER45', ...]: 
     dataDocument = objectify.parse(f.read()) 
     dataDocument.party.partyID._setText(pId) 
     ... 
     obj_xml = lxml.etree.tostring(dataDocument) 
     with open('out_%s.xml' % pId, 'w') as f_out: 
      f.write(obj_xml) 

另一種方法可能是再次使用lxml and xslt,從一個空的結構化xml開始,根據需要轉換結構。

相關問題