3

Builder::XmlMarkup を使用して、RESTful API サーバー用の XML 形式のデータ構造を生成しています。

最近、Builder::XmlMarkup からのプリティ プリンティングが、本来あるべき空の要素ではなく、空白文字でいっぱいの要素を生成するというバグを発見しました。

たとえば、次のコード:

xml.outertag do
  xml.list do
    # Some code which loops through a list
  end
end

生産しています:

<outertag>
  <list>
  </list>
</outertag>

内側のリストが空のリストの場合、要素は空でなければなりません (例: <list/> または <list></list>)。ただし、実際の XML は、改行とその他の空白で満たされた <list> タグです。

では、Builder のきれいな印刷を完全になくすにはどうすればよいでしょうか? 現在、初期化が:indentパラメータを無視するように、Builder::XmlMarkup にモンキー パッチを適用することを考えています。after_filter も検討していますが。

4

2 に答える 2

3

インデントパラメータをまったく使用せずに呼び出しBuilder::XmlMarkup.newても、空白は表示されません。

xml = Builder::XmlMarkup.new
xml.outertag do
  xml.list do
    # Some code which loops through a list
  end
end

xml # => <outertag><list></list></outertag>
于 2009-08-22T14:30:30.843 に答える
0

最も一般的に適用できると思われるマットの回答を受け入れます。しかし、私の状況はすべてのURL に対して XML を出力する API であるため、全面的に機能するものが必要です。

そのための2つの解決策を次に示します。

  1. (私の現在の解決策)ActionView::TemplateHandlers::Builderにモンキーパッチを適用して0インデントを強制する単純なプラグインを作成します(Mattの回答による)。残念ながら、ActionView::TemplateHandlers::Builder は、ほとんどが後で eval() される Ruby コードの不透明な文字列です。これが私のメインモジュールです。これには次のものが含まれます。

    module MinimalXml
      module Builder
        def self.included(base)
          base.class_eval do
            def compile(template)
              indent = 0
              "_set_controller_content_type(Mime::XML);" +
                "xml = ::Builder::XmlMarkup.new(:indent => #{indent});" +
                "self.output_buffer = xml.target!;" +
                template.source +
                ";xml.target!;"
            end
          end
        end
      end
    end
    
  2. (おそらく将来の解決策です。) 本格的な XML ベースの Web サービスでは、送受信される XML を処理し、それを検証し、その他必要なことを行う必要があると思います。これは Rack ミドルウェアの有力候補です。したがって、最終的には、発信 XML を検証し (無効な場合は警告を鳴らすなど)、開発モードの場合はプリティプリントするか、本番環境で圧縮する単純な Rack ミドルウェア レイヤーを作成することを予見しています。

于 2009-09-28T05:12:58.257 に答える