使用lxml生成xml文档,并根据逻辑改变元素文本和属性 [英] Generate xml documents using lxml and vary element text and attributes based on logic

查看:262
本文介绍了使用lxml生成xml文档,并根据逻辑改变元素文本和属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样的lxml代码

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)

我需要生成一个xml文件,例如

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>

现在上面的代码可以工作了. 但是我需要生成10k这样的文件,其中元素的文本或属性会有所不同. 例如partyID可能不同 有没有一种干净的方法可以代替硬编码来执行PARTYGER45而不是PARTYUS33呢? 同样,我需要改变很多东西,例如tradeId TW9235

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

推荐答案

一种方法是在不将值加载到

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)

另一种方法可能是使用 lxml和xslt ,同样,从空的结构化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.

这篇关于使用lxml生成xml文档,并根据逻辑改变元素文本和属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆