0

I have my lxml code like this

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)

And i need to generate a xml file like

<?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>

Now the above code works. However i need to generate 10k such files where the elements text or attributes vary . For example the partyID maybe different like PARTYGER45 instead of PARTYUS33 is there a clean way to do this instead of hard coding it ? Similarly i need to vary lot of things like the tradeId TW9235

jhon.smith
  • 1,963
  • 6
  • 30
  • 56

1 Answers1

1

one way could be to have the output xml without values loaded to lxml objectify and then loop while setting relevant values and write it to a file, meaning

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)

another way might be to use lxml and xslt, again, start from an empty structured xml and transform the structure according to your needs.

Guy Gavriely
  • 11,228
  • 6
  • 27
  • 42