2017-06-09 43 views
0

我想在xml文件中創建幾個element.text。我成功地獲得了兩個列表,第一個將字符串重新組合成long long element.text作爲str(long_name),第二個重新組合後成爲troncation(short_name)。如何用lxml替換XML上的文本?

現在我想更換我的XML的element.text,我嘗試了一些劇本,但我surrended與功能readlines方法(),我想找到LXML類似的解決方案,因爲這代碼工作:

txt = open('IF_Generic.arxml','r') 
Lines = txt.readlines() 
txt.close() 

txt = open('IF_Genericnew.arxml','w') 

for e in range(len(long_name)) : 
    for i in range(len(Lines)) : 
     if (long_name[e] in Lines[i]) == True : 
      Lines[i] = Lines[i].replace(long_name[e],short_name[e]) 

for i in Lines : 
    txt.write(i) 

txt.close() 

我嘗試這樣做,但它不工作:

f = open('IF_Generic.arxml') 
arxml = f.read() 
f.close() 
tree = etree.parse(StringIO(arxml)) 
for e,b in enumerate(long_name) : 
    context = etree.iterparse(StringIO(arxml)) 
    for a,i in context: 
     if not i.text: 
      pass 
     else: 
      if (b in i.text) == True : 
       i.text = short_name[e] 

obj_arxml = etree.tostring(tree,pretty_print=True) 

f = open('IF_Genericnew.arxml','w') 
f.write(obj_arxml) 
f.close() 

假設列表LONG_NAME的第一個元素是RoutineServices_EngMGslLim_NVMID03

<BALISE_A> 
    <BALISE_B> 
     <SHORT-NAME>RoutineServices_EngMGslLim_NVMID03</SHORT-NAME> 
    </BALISE_B> 
</BALISE_A> 
<BALISE_C> 
    <POSSIBLE-ERROR-REF DEST="APPLICATION-ERROR">/Interfaces/RoutineServices_EngMGslLim_NVMID03/E_NOT_OK</POSSIBLE-ERROR-REF> 
    <SHORT-NAME>Blah_Bleh_Bluh</SHORT-NAME> 
</BALISE_C> 

列表SHORT_NAME的第一個元素是RoutineServices_EngMGslLim_NV

<BALISE_A> 
    <BALISE_B> 
     <SHORT-NAME>RoutineServices_EngMGslLim_NV</SHORT-NAME> 
    </BALISE_B> 
</BALISE_A> 
<BALISE_C> 
    <POSSIBLE-ERROR-REF DEST="APPLICATION-ERROR">/Interfaces/RoutineServices_EngMGslLim_NV/E_NOT_OK</POSSIBLE-ERROR-REF> 
    <SHORT-NAME>Blah_Bleh_Bluh</SHORT-NAME> 
</BALISE_C> 

我想這

P.S:我使用Python 2.7.9

提前感謝大家!

+0

@mzjn爲了簡化,我們會說我有2個列表,我想瀏覽我的xml中的所有element.text並將其替換。列表long_name是知道我是否需要替換文本的標準,而列表short_name是我想要放置的新文本。我不能給你這個xml文件,因爲它就像500k行。 – Noxos

+0

@mzjn我試圖儘可能小 – Noxos

回答

0

不要打開XML文件,如文本文件。我有explained in this answer爲什麼這是一個壞主意。

只需讓etree讀取和寫入文件。編寫代碼也少。

而是在全力元素,這是什麼呢"//*"的,你可以用更具體的XPath來縮小你想工作的元素。

例如,像"//SHORT-NAME | //POSSIBLE-ERROR-REF"這樣的東西將有助於減少整體工作量。

+0

我試着你的解決方案,但我得到了這個錯誤的「序列化和寫入文件」部分:'模塊'對象沒有屬性'寫'缺少什麼東西? 我必須檢查所有元素,所以我不能指定Xpath。 – Noxos

+0

哎呀,錯字。我鍵入'etree.write(...)',但當然我的意思是'tree.write(...)'。這是固定的。 – Tomalak

+0

這就是我的想法!我正在測試它。 – Noxos