2012-05-19 71 views
2

我盡我所能搜索答案,但沒有辦法弄到符合我需要的東西。我正嘗試將XML文件重新格式化爲自定義格式並遇到問題。這是我的要求。python file.next()正在搞亂for循環

我有下面的XML文件:

<parameters> 
    <parameter name="name1" value="value1"/> 
    <parameter name="name2" value="value2"/> 
    <parameter name="name3" value="value3"/> 
    <parameter name="name4" value="value4"/> 
</parameters> 

我期待將其轉換成以下。

(param().name("name1").value("value1"), 
param().name("name2").value("value2"), 
param().name("name3").value("value3"), 
param().name("name4").value("value4")); 

我試過使用下面的代碼,它似乎是跳過一些數據從原始文件到輸出。

with open("myfile","r") as f: 
    for each_line in f: 
     current_line = each_line 
     if current_line.strip().startswith('<'): 
      split_line = current_line.strip().split(' ') 
      if split_line[0].lstrip('<') == "parameter": 
       if f.next().strip() == "</parameters": 
        print 'param().name(' + split_line[1].split('=')[1] + ').value('+ split_line[2].split('=')[1][:-2] + '));\n\n' 
       else: 
        print 'param().name(' + split_line[1].split('=')[1] + ').value('+ split_line[2].split('=')[1][:-2] + ')' 

我看到使用f.next()導致的問題...不知道我怎麼能解決這個問題。

回答

5

您可能應該爲此使用XML解析器。

要解決你的代碼,你可以存儲在列表中的結果,並加入它一起並在最後打印:

result = [] 

with open("myfile","r") as f: 
    for each_line in f: 
     current_line = each_line.strip() 
     if current_line.startswith('<parameter '): 
      split_line = current_line.split(' ')  # Breaks if there are spaces in name or value. 
      name = split_line[1].split('=')[1]  # Yuck. 
      value = split_line[2].split('=')[1][:-2] # Yuck. 
      result.append('param().name({0}).value({1})'.format(name, value) 

print '(' + ',\n'.join(result) + ');\n\n' 

注意,你發現XML中的字符串的方式並不強大,文件的小改動會帶來問題。使用XML解析器將使其不太可能中斷。

相關

+0

嗯...我認真應該考慮一下XML解析器:) 馬克,我想用逗號結束行,如果它只有最後一行的任何行和分號。 – Balaji

+1

@BalajiCuttackam:哦,添加逗號需要完整的重寫。也許是時候徹底拋棄這些代碼並改用XML解析器。 –

+0

我現在正在嘗試...感謝您的建議! – Balaji

0

井,f.next()只是做一個多迭代,從而改變當前行迭代器。 這不是你想要的。

但是,你不使用一個XML解析器?