0

私のpython(2.6)スクリプトが遭遇する2つの異なるファイルを次に示します。一方は解析し、もう一方は解析しません。なぜこれが起こるのか、私はただ興味があります。

この xml ファイルは解析されず、スクリプトは失敗します。

<Landfire_Feedback_Point_xlsform id="fbfm40v10" instanceID="uuid:9e062da6-b97b-4d40-b354-6eadf18a98ab" submissionDate="2013-04-30T23:03:32.881Z" isComplete="true" markedAsCompleteDate="2013-04-30T23:03:32.881Z" xmlns="http://opendatakit.org/submissions">
<date_test>2013-04-17</date_test>
<plot_number>10</plot_number>
<select_multiple_names>BillyBob</select_multiple_names>
<geopoint_plot>43.2452830500 -118.2149402900 210.3000030518 3.0000000000</geopoint_plot><fbfm40_new>GS2</fbfm40_new>
<select_grazing>NONE</select_grazing>
<image_close>1366230030355.jpg</image_close>
<plot_note>No road present.</plot_note>
<n0:meta xmlns:n0="http://openrosa.org/xforms">
<n0:instanceID>uuid:9e062da6-b97b-4d40-b354-6eadf18a98ab</n0:instanceID>
</n0:meta>
</Landfire_Feedback_Point_xlsform>

この xml ファイルは正しく解析され、スクリプトは成功します。

<Landfire_Feedback_Point_xlsform id="fbfm40v10">
<date_test>2013-05-14</date_test>
<plot_number>010</plot_number>
<select_multiple_names>BillyBob</select_multiple_names>
<geopoint_plot>43.26630563 -118.39881809 351.70001220703125 5.0</geopoint_plot>
<fbfm40_new>GR1</fbfm40_new>
<select_grazing>HIGH</select_grazing>
<image_close>fbfm40v10_PLOT_010_ID_6.jpg</image_close>
<plot_note>Heavy grazing</plot_note>
<meta><instanceID>uuid:90e7d603-86c0-46fc-808f-ea0baabdc082</instanceID></meta>
</Landfire_Feedback_Point_xlsform>

これは、一方が機能し、他方が機能しないことを示す小さな python スクリプトです。ElementTree が一方を xml ファイルと見なし、もう一方をそうでない理由についての説明を探しています。具体的には、解析していないように見えるものは、「'NONE' タイプには 'text' 属性がありません」などで失敗します。しかし、それは、ファイルを xml と見なしていないように見えるか、開始行を超える要素が表示されないためです。このエラーに関する説明または指示をいただければ幸いです。前もって感謝します。

Python スクリプト:

import os
from xml.etree import ElementTree


def replace_xml_attribute_in_file(original_file,element_name,attribute_value):
    #THIS FUNCTION ONLY WORKS ON XML FILES WITH UNIQUE ELEMENT NAMES
    #  -DUPLICATE ELEMENT NAMES WILL ONLY GET THE FIRST ELEMENT WITH A GIVEN NAME

    #split original filename and add tempfile name
    tempfilename="temp.xml"
    rootsplit = original_file.rsplit('\\')  #split the root directory on the backslash
    rootjoin = '\\'.join(rootsplit[:-1]) #rejoin the root diretory parts with a backslash -minus the last 
    temp_file = os.path.join(rootjoin,tempfilename) 
    et = ElementTree.parse(original_file)
    author=et.find(element_name)
    author.text = attribute_value
    et.write(temp_file)
    if os.path.exists(temp_file) and os.path.exists(original_file): #if both the original and the temp files exist
        os.remove(original_file)                                    #erase the original
        os.rename(temp_file,original_file)                          #rename the new file
    else:
        print "Something went wrong."

replace_xml_attribute_in_file("testfile1.xml","image_close","whoopdeedoo.jpg");
4

1 に答える 1