2011-12-06 2 views
17

現在、Nokogiri :: XML :: Builderクラスを使用してXMLドキュメントを構築し、その上に.to_xmlを呼び出しています。結果として得られる文字列には、ノードの間にスペース、改行、キャリッジリターンが常に含まれています。私の人生にとっては、それらを取り除く方法を理解できません。ここでは例です:Nokogiri to_xmlキャリッジリターンなし

b = Nokogiri::XML::Builder.new do |xml| 
    xml.root do 
    xml.text("Value") 
    end 
end 

b.to_xml 

これは、次のような結果になります。私が欲しいもの

<?xml version="1.0"?> 
<root>Value</root> 

は(行方不明改行を注意)これです:

<?xml version="1.0"?><root>Value</root> 

はどのようにこれを行うことができますか?前もって感謝します!

答えて

29

Builder#to_xmlデフォルトでは、フォーマットされた(インデントされた)XMLが出力されます。 Nokogiri::XML::Node::SaveOptionsを使用すると、ほぼフォーマットされていない結果が得られます。

b = Nokogiri::XML::Builder.new do |xml| 
    xml.root do 
    xml.foo do 
     xml.text("Value") 
    end 
    end 
end 

b.to_xml 
#=> "<?xml version=\"1.0\"?>\n<root>\n <foo>Value</foo>\n</root>\n" 

b.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML) 
#=> "<?xml version=\"1.0\"?>\n<root><foo>Value</foo></root>\n" 
今、あなたはどちらかだけの(とにかくオプション)XMLヘッダを取り除くことができ

、最後の改行 ちょうどXML内の任意の改行を削除

はおそらく改行として悪い考えである

b.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML | Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).strip 
#=> "<root><foo>Value</foo></root>" 
を削除実際には有意義である可能性があります(例えば、 <pre>ブロックのXHTML)。それがあなたには当てはまらない場合(そしてあなたが本当にそれを確信している場合)、あなたはそれを行うことができます。

+0

残念ながら、私はNokogiri v1.3.3を使用して立ち往生していますが、to_xmlに引数を渡すことはできません。さもなければ、これはすばらしい解決策になります。 – Cameron

+1

ああ、それを持っています。あなたはto_xmlの代わりに保存オプションを渡すことでこのメソッドを使うことができるようです: 'b.doc.serialize(:save_with => Nokogiri :: XML :: Node :: SaveOptions :: AS_XML)' – Cameron

+2

私の最終的な解決策次のようになります。 'builder.doc.serialize(:save_with => Nokogiri :: XML :: Node :: SaveOptions :: AS_XML).sub(" \ n "、" ").strip' – Cameron

3

これは、ノコギリのためにデザインされたものではありません。あなたが得ることができる最も近い無改行やインデントにドキュメントのルートをシリアル化し、次に(あなたが本当にそれを必要とする場合)PIを自分で追加することです:

require 'nokogiri' 

b = Nokogiri::XML::Builder.new{ |xml| xml.root{ xml.foo "Value" } } 
p b.to_xml 
#=> "<?xml version=\"1.0\"?>\n<root>\n <foo>Value</foo>\n</root>\n" 

p b.doc.serialize(save_with:0) 
#=> "<?xml version=\"1.0\"?>\n<root><foo>Value</foo></root>\n" 

flat_root = b.doc.root.serialize(save_with:0) 
p flat_root 
#=> "<root><foo>Value</foo></root>" 

puts %Q{<?xml version="1.0"?>#{flat_root}} 
#=> <?xml version="1.0"?><root><foo>Value</foo></root> 

また、あなたは、単にカンニングして行うことができます:

puts b.doc.serialize(save_with:0).sub("\n","") 
#=> <?xml version="1.0"?><root><foo>Value</foo></root> 

注のみ最初の既知本改行を置換するsub代わりにgsubの使用。

+0

このソリューションは、受け入れられたものとほぼ同じです - ありがとう! – Cameron

-1

b.to_xmlは文字列を返します。文字列の最初のインスタンス\nを置き換えるだけで済みます。

おそらく、メソッドのオーバーロードよりも簡単です。

+2

最初の\ nだけを置き換えることはできません - 私が実際に作成している文書は深いレベルであり、各ノードには後に\ nがあります。ノードのテキストの一部に\ n文字も含まれています。これは保存する必要があります(これはAndroid用で、Javaスタイルの文字列が必要です)。 – Cameron

関連する問題