2012-05-19 97 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解析器?