0

Ruby 1.9.3 と REXML を使用して XML ドキュメントを解析し、いくつかの変更 (追加/削除) を行ってから、ファイルを再出力しています。このファイル内には、次のようなブロックがあります。

<someElement>
  some.namespace.something1=somevalue1
  some.namespace.something2=somevalue2
  some.namespace.something3=somevalue3
</someElement>

問題は、ファイルを書き直した後、このブロックが常に次のようになることです。

<someElement>
  some.namespace.something1=somevalue1
  some.namespace.something2=somevalue2 some.namespace.something3=somevalue3
</someElement>

2 番目の値の後の改行 (最初の値ではありません!) が失われ、スペースに変わりました。後で、私が制御も影響も及ぼさない他のコードがこのファイルを読み取り、それらの改行に依存してコンテンツを適切に解析します。通常、この状況では CDATA を使用して空白を保持しますが、後でこのデータを解析するコードは空白を想定していないため、これはオプションではありません。この要素の内部テキストをそのまま保持することが不可欠です。 .

私の読み取り/書き込みコードは次のようになります。

xmlFile = File.open(myFile)
contents = xmlFile.read
xmlDoc = REXML::Document.new(contents, { :respect_whitespace => :all })
xmlFile.close

{perform some tasks}

out = ""
xmlDoc.write(out, 2)
File.open(filePath, "w"){|file| file.puts(out)}

REXML を使用してこの方法でファイルを読み書きするときに、要素間のテキストの空白を保持する方法を探しています。この件に関するスタックオーバーフローに関する他の多くの質問を読みましたが、このシナリオを完全に再現するものはありません。アイデアや提案は大歓迎です。

4

1 に答える 1

1

indent(2番目の)パラメーターを削除することで正しい動作が得られますDocument.write()

#xmlDoc.write(out, 2)
xmlDoc.write(out)

docsDocument.write()を読んだところによると、それはバグのようですが、インデントを設定する必要が本当にない場合は、それをオフにしておくと問題が解決するはずです。

于 2013-04-10T21:08:26.790 に答える