2011-12-28 8 views
0

&quoteを使用できることはわかっていますが、\"など、あまり鈍くて長い方法があるかどうかは疑問でした。XML内のRubyの二重引用符を逃れる方法

<root name="test" type="Node" action="{puts :ROOT.to_s}"> 
    <leaf type="Node" decider="{print :VAL1.to_s; gets.chomp.to_i}" action="{puts :ONE.to_s}" /> 
    <leaf type="Node" decider="{print :VAL2.to_s; gets.chomp.to_i}" action="{puts :TWO.to_s}" /> 
    <branch type="Node" decider="{100}" action="{}"> 
     <leaf type="LikelihoodNode" decider="{100}" action="{puts :HI.to_s}" arg="0"/> 
    </branch> 
</root> 

これを必要とする属性がdecideractionです: は、ここではXMLの一例です。現在、埋め込みコードはsym:to_sハックを少し使っていますが、それは解決策ではありません。

注:action属性は括弧内のブロックにすぎませんが、処理コードはlambdaをあらかじめ保留しています。

+1

/how/whyのときにエスケープしますか? –

+0

私はRubyコードをXMLに埋め込んでいます。文字列が必要なときに '&quote'と打たなければならないとコードは実行できません。 – Linuxios

+0

RubyコードをXML属性の中に埋め込んでいますか? REXMLを使用して文書を生成していますか?あなたの望むXML出力は何ですか? – Phrogz

答えて

1

XML属性内の二重引用符は、&quote;(または&#34;または&#x22;)と書かれています。一重引用符にも同様の問題があるので、それらを使用することはできません。しかし、あなたは、XML属性にそのままあるので%|...|%を使用%Q|...|、および%q|...|が利用可能であり、彼らは引用符のように読みやすいし、タイプとしてしていることができます。

<root name="test" type="Node" action="{puts %|ROOT|}"> 
    <leaf type="Node" decider="{print %|VAL1|; gets.chomp.to_i}" action="{puts %|ONE|}" /> 
    <!-- ... --> 
</root> 

はあなたの最も簡単な見つけ方区切り文字を選択しますタイプと読み取り。

あなたが持つことができるので、あなたはまた、XMLでの属性の単一引用符を使用することができます。

<leaf type='Node' decider='{print "VAL1"; gets.chomp.to_i}' ... 

をしかし、その後、あなたは、単一引用符を含めるために、必要に応じて属性内&apos;を使用する必要があると思います。

代わりに、要素の代わりに、属性に切り替えることができます:

<leaf type="Node"> 
    <decider><![CDATA[ 
     print "VAL1" 
     gets.chomp.to_i 
    ]]></decider> 
    <action><![CDATA[ 
     puts "ONE" 
    ]]></decider> 
</leaf> 

が、それは少し、冗長醜い、および属性(私見)などと連携するように簡単ではありません。

+1

また、一意引用符は合法的なXML属性区切り文字とRuby文字列区切り文字(補間が必要ない場合)であることに注意してください。 – Phrogz

+0

答えをありがとう。私は最初のアプローチがより好きです。これは私が探していたものなので、私は答えを受け入れるつもりです。これを解析するスクリプトがファイルからコードを取得できることを考慮すると、これは完璧なものになります。 – Linuxios

+0

@Phrogz:しかし、あなたは '' 'vs' ' 'の問題に遭遇するかもしれませんか?私は帽子のドロップで一重引用符や二重引用符を捨てる傾向があります。引用やエスケープの問題よりも心配する重要な事柄(昨夜の雪の量など)があります。私は完全性のための単一引用符についてのノートを追加します。 –

関連する問題