2013-08-30 3 views
1

OFX 내보내기 파일에서 xml 필드를 수정하려고합니다. 내보내기 제작자는 파일에있는 fitid에 대한 고유 키를 생성하지 않으므로 xml의 다른 두 필드에서 생성 된 고유 키로 해당 필드를 바꾸려고합니다.수정 된 XML 요소를 파이썬에 작성하십시오.

나는 다음 코드를 가지고 있지만 새로운 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> 

내 파이썬 시도는 다음과 같습니다

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') 
+0

당신이 코드의 출력을 보여줄 수 :

이 코드를 시도? –

답변

1

이 문제는 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') 
+0

감사합니다 @audiodude, 내가 예상했던 (또는 오히려) 원하는 방식으로 작동합니다. 그리고 네, 제 코드에서 오타였습니다. 긴 밤... – sportsnapper

관련 문제