2

答えを探すために最善を尽くしましたが、私のニーズに合ったものを見つけることができませんでした. XML ファイルをカスタム形式に再フォーマットしようとしていますが、問題が発生しています。これが私の要件です。

次の 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() を使用すると問題が発生することがわかります...他にどうすればこれを解決できるかわかりません。

4

2 に答える 2

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 パーサーを使用すると、破損する可能性が低くなります。

関連している

于 2012-05-19T20:52:21.217 に答える
0

ええと、f.next()はもう1回の反復を実行しているだけなので、現在の行の反復子を変更します。それはあなたが望んでいるように見えるものではありません。

しかし、xmlパーサーを使用しないのは何ですか?

于 2012-05-19T20:55:39.403 に答える