2012-05-19 5 views
2

나는 최선을 다해 대답을 찾았지만, 내 요구에 맞는 것을 만들 수 없었다. XML 파일을 사용자 지정 형식으로 다시 형식화하고 문제를 해결하려고합니다. 여기 내 요구 사항입니다. 내가 다음에 그 변환 찾고 있어요Python file.next()가 for 루프를 엉망으로 만들고있다

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

:

나는 다음과 같은 XML 파일이 있습니다.

(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 구문 분석기를 사용하면 파싱 가능성이 줄어 듭니다.

관련

  • XML parsing in Python
    +0

    글쎄 ... XML 파서에 대한 생각을 진지하게 받아 들여야했다. :) 마크. 마지막 줄만 있으면 줄과 세미콜론이 있으면 쉼표로 끝내고 싶다. – Balaji

    +1

    @BalajiCuttackam : 아, 쉼표를 추가하면 완전히 다시 작성해야합니다. 아마도이 코드를 완전히 버리고 XML 파서를 대신 사용해야 할 때입니다. –

    +0

    나는 그것을 지금 시험하고있다. .. 제안에 감사드립니다!! – Balaji

    0

    아니라, f.next()가 하나 더 반복을하고있다 따라서 현재 라인의 반복자를 변경합니다. 그건 당신이 원하는 것처럼 보이지 않습니다.

    하지만 xml 파서를 사용하지 않으시겠습니까?

    관련 문제