Генерация XML-документов с использованием lxml и изменение текста и атрибутов элемента на основе логики

У меня есть такой код lxml

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)

И мне нужно создать XML-файл, как

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

Теперь приведенный выше код работает. Однако мне нужно сгенерировать 10k таких файлов, где элементы текста или атрибуты различаются. Например, partyID может отличаться от PARTYGER45 вместо PARTYUS33. Есть ли чистый способ сделать это вместо жесткого кодирования? Точно так же мне нужно изменить много вещей, таких как tradeId TW9235

1 ответ

Решение

Одним из способов может быть вывод xml без значений, загруженных в http://lxml.de/objectify.html, а затем зацикливание при установке соответствующих значений и запись его в файл, что означает

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 и xslt, опять же, начните с пустого структурированного xml и преобразуйте структуру в соответствии с вашими потребностями.

Другие вопросы по тегам