python - 在 python 中编写修改后的 XML 元素

标签 python xml elementtree

我正在尝试修改 OFX 导出文件中的 xml 字段。导出的生产者不会为文件中提交的 fitid 生成唯一 key ,因此我想将该字段替换为从 xml 中的其他两个字段生成的唯一 key 。

我已经掌握了以下代码,但无法弄清楚如何编写新的 FITID 字段。

XML 文件的示例是:

    <BANKTRANLIST>
                <DTSTART>20130705</DTSTART>
                <DTEND>20130805</DTEND>
                <STMTTRN>
                    <TRNTYPE>DEBIT</TRNTYPE>
                    <DTPOSTED>20130708</DTPOSTED>
                    <TRNAMT>-7.99</TRNAMT>
                    <FITID>08072013660</FITID>
                    <NAME>HARE HATCH SHEEPLANDS    </NAME>
                    <MEMO>Effective date: 06/07/2013</MEMO>
                </STMTTRN>
                <STMTTRN>
                    <TRNTYPE>DEBIT</TRNTYPE>
                    <DTPOSTED>20130708</DTPOSTED>
                    <TRNAMT>-6.75</TRNAMT>
                    <FITID>08072013660</FITID>
                    <NAME>BINGHAMS BREWERY LIMIT   </NAME>
                    <MEMO>Effective date: 06/07/2013</MEMO>
                </STMTTRN>
                <STMTTRN>
                    <TRNTYPE>DEBIT</TRNTYPE>
                    <DTPOSTED>20130709</DTPOSTED>
                    <TRNAMT>-282.5</TRNAMT>
                    <FITID>09072013660</FITID>
                    <NAME>WWW.DVLA.GOV.UK          </NAME>
                    <MEMO>Effective date: 08/07/2013</MEMO>
                </STMTTRN>
                <STMTTRN>
                    <TRNTYPE>DEBIT</TRNTYPE>
                    <DTPOSTED>20130715</DTPOSTED>
                    <TRNAMT>-84.78</TRNAMT>
                    <FITID>15072013660</FITID>
                    <NAME>BP TWYFORD CONNECT       </NAME>
                    <MEMO>Effective date: 12/07/2013</MEMO>
                </STMTTRN>
                <STMTTRN>
                    <TRNTYPE>DEBIT</TRNTYPE>
                    <DTPOSTED>20130715</DTPOSTED>
                    <TRNAMT>-25.1</TRNAMT>
                    <FITID>15072013660</FITID>
                    <NAME>WHITE HART SHERFIE       </NAME>
                    <MEMO>Effective date: 13/07/2013</MEMO>
                </STMTTRN>
    </BANKTRANLIST>

我的Python尝试是:

    from xml.etree import ElementTree as et

    datafile = '/Volumes/Data/Projects/moneydance fix/statement20130805.ofx'

    tree = et.parse(datafile)
    root = tree.getroot()
    for stmtrn in root.iter('STMTTRN'):
    amount = stmtrn.find('TRNAMT').text
    date = stmtrn.find('DTPOSTED').text
    fitid = stmtrn.find('DTPOSTED').text
    print "amount: ", (amount.split('.')[0])[1:]
    amount = (amount.split('.')[0])[1:]

    fitid.text = (date + amount).ljust(12,'0')
    print 'New fitid: ', fitid

    tree.write(datafile+'new')

最佳答案

问题是对于 fitid,您不需要元素的 text,您需要元素本身。因此,您不想执行 stmtrn.find('FITID').text 而是执行 stmtrn.find('FITID')。这将使您的作业 fitid.text = .... 按预期工作。

而且您肯定不想执行 fitid = stmtrn.find('DTPOSTED') ,我认为这是您粘贴的代码中的拼写错误。

试试这个代码:

from xml.etree import ElementTree as et

datafile = 'statement20130805.ofx'

tree = et.parse(datafile)
root = tree.getroot()
for stmtrn in root.iter('STMTTRN'):
  amount = stmtrn.find('TRNAMT').text
  date = stmtrn.find('DTPOSTED').text

  print "amount: ", (amount.split('.')[0])[1:]
  amount = (amount.split('.')[0])[1:]

  fitid = stmtrn.find('FITID')
  fitid.text = (date + amount).ljust(12,'0')
  print 'New fitid: ', fitid.text

tree.write(datafile+'new')

关于python - 在 python 中编写修改后的 XML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18541288/

相关文章:

python - 使用行为进行 API 端点测试

来自 SVG 的 Python Gtk3 窗口图标/来自股票主题的可缩放图标

xml - XSLT 传递参数

html - XPath用于标签和下拉列表的组合

python - Python 的 ElementTree.XML() 和 ElementTree.fromstring 有什么区别?

python - 避免对第一个和/或最后一个元素进行操作

python - 从Mac上的远程控制设备读取输入

Android 高度不适用于不同的圆角矩形

python - 为什么 python 中的元素树在 XML 中添加额外的新行和空格

python - 将 ElementTree findall() 转换为列表