rexmlにCDATAを追加
5682 ワード
最近rubyでibatis sqlmapを生成できるxmlファイルを書こうと思っていたのですが、以前は気づかなかったのですが、探してみると持参したパッケージの中にあったのですが、それがrexmlで、普通のテキストの内容を生成するのに問題なく、今日は突然いくつかのsql文を
では、結果は成功しませんでした.いずれにしても、「〈〉」という二つのカッコは転義され、ネットで探しても答えは見つからない.
やっとcdataについて見つけましたrbの内容は、あまりはっきり言っていませんが、少なくとも考え方を提供してくれたので、自分でruby libのcdataを見ました.rbのソースコードは、writeが使用できます.使い方は以下の通りです.
この方法は可能であるべきで、それはTextから受け継いで、つまりTextの地方もCDataに用いることができて、しかしこの方法はdeprecatedマークを書いて、注釈の上でrexm l/formattersを見に行くと言って、そこで自分でこのディレクトリを見つけて、下に3つのファイルがあります:default.rb pretty.rb transtive.rb、じゃあ自分で使っているのはあのformatterですか?出力されたコードはこの文です.
そこで自分でdocumentのwriteメソッドを見つけました.
indentは4なので、Prettyというformatterを採用すべきで、迷わずprettyを開きます.rbこのファイルは、writeという名前を除いて数分見ました.cdataの方法は少し似ていますが、特別なものは見つかりませんでした.
しかし、この方法も特別なものではなく、非常に一般的で、どう見ても「
答えが見つかりました.問題は解決したようです.そこで、自分で簡単な文を書いてテストしました.
ただし、コンソールのプロンプトwrite_cdataメソッドはpretectedで、外部では使用できませんが、どうすればいいですか?最後に半日見てやっと答えが見つかり、documentのwriteの最後の一言を無視しました.
この言葉が肝心なので、Defaultのwriteメソッドを見つけました.
やっと答えが見つかりました.コンテンツのフォーマットはnodeのタイプによって決まります.つまり、CDataオブジェクトを作成し、Textにこのオブジェクトを割り当てるだけで、documentはどのように出力するかを知っています.
このようにして出力されるxmlは「」に含まれます.上からwriteメソッドでは、Comment、DocType、XMLDeclなどの他のノードタイプを追加する場合、対応するオブジェクトを作成し、対応するオブジェクトに追加するだけで、対応するフォーマットが自然に生成されることがわかります.
この問題はほとんど自分の午前中の時間を費やして、rubyは以前も学んだことがありますが、ずっとあまり使っていないので、ほとんど忘れてしまいました.昨日本屋で偶然rubyの父松本行弘(この名前は覚えにくい)の松本行弘という本を見ました.そこで再び元のruby programmingを手に取って見てみると、2、3日で基本的にibatisを生成するsqlmapファイル、基本的なdao、service、domainなどを書くようになり、javaで書くよりも効率的になりました.それからネットでその<松本行弘のプログラムの世界>を买いました(ネットで7、5割引して邮便料金をプラスしないで、确かに本屋よりずっと安くて、私は新华书店で多くの本を买って、割引したことがありません).rubyは確かに面白い言語で、開発の過程でいつもいくつかの場所で自分を驚かせ、喜ばせます.これは他の言語を使ったことがありません.特にjavaはjavaでプログラムを開発するのがこんなに長いので、基本的には飽きています.
10.19:また、各elementの間に空白の改行文字を付けたい場合は、次のようにします.
この問題は本人が文書を見て、主にElementとDocumentの2つのクラスを見て、すべて何の収穫もなくて、そこで更にFormattersモジュールのPrettyを見て、パラメータが利用できることを発見していないで、ソースコードを変えるしかないようです.Prettyのwrite_を直接修正Elementメソッド:
つまり、その要素の最後の行に改行を加えればいいのです.
では、結果は成功しませんでした.いずれにしても、「〈〉」という二つのカッコは転義され、ネットで探しても答えは見つからない.
やっとcdataについて見つけましたrbの内容は、あまりはっきり言っていませんが、少なくとも考え方を提供してくれたので、自分でruby libのcdataを見ました.rbのソースコードは、writeが使用できます.使い方は以下の通りです.
c = CData.new( " Some text " )
c.write( $stdout ) #-> <![CDATA[ Some text ]]>
この方法は可能であるべきで、それはTextから受け継いで、つまりTextの地方もCDataに用いることができて、しかしこの方法はdeprecatedマークを書いて、注釈の上でrexm l/formattersを見に行くと言って、そこで自分でこのディレクトリを見つけて、下に3つのファイルがあります:default.rb pretty.rb transtive.rb、じゃあ自分で使っているのはあのformatterですか?出力されたコードはこの文です.
doc.write(xmlFile,4)
そこで自分でdocumentのwriteメソッドを見つけました.
def write( output=$stdout, indent=-1, transitive=false, ie_hack=false )
if xml_decl.encoding != "UTF-8" && !output.kind_of?(Output)
output = Output.new( output, xml_decl.encoding )
end
formatter = if indent > -1
if transitive
require "rexml/formatters/transitive"
REXML::Formatters::Transitive.new( indent, ie_hack )
else
REXML::Formatters::Pretty.new( indent, ie_hack )
end
else
REXML::Formatters::Default.new( ie_hack )
end
formatter.write( self, output )
end
indentは4なので、Prettyというformatterを採用すべきで、迷わずprettyを開きます.rbこのファイルは、writeという名前を除いて数分見ました.cdataの方法は少し似ていますが、特別なものは見つかりませんでした.
def write_cdata( node, output)
output << ' ' * @level
super
end
しかし、この方法も特別なものではなく、非常に一般的で、どう見ても「
def write_cdata( node, output )
output << CData::START
output << node.to_s
output << CData::STOP
end
答えが見つかりました.問題は解決したようです.そこで、自分で簡単な文を書いてテストしました.
t = REXML::Formatters::Default.new
puts t.write_cdata("fff",$stdout);
ただし、コンソールのプロンプトwrite_cdataメソッドはpretectedで、外部では使用できませんが、どうすればいいですか?最後に半日見てやっと答えが見つかり、documentのwriteの最後の一言を無視しました.
formatter.write( self, output )
この言葉が肝心なので、Defaultのwriteメソッドを見つけました.
def write( node, output )
case node
when Document
if node.xml_decl.encoding != "UTF-8" && !output.kind_of?(Output)
output = Output.new( output, node.xml_decl.encoding )
end
write_document( node, output )
when Element
write_element( node, output )
when Declaration, ElementDecl, NotationDecl, ExternalEntity, Entity,
Attribute, AttlistDecl
node.write( output,-1 )
when Instruction
write_instruction( node, output )
when DocType, XMLDecl
node.write( output )
when Comment
write_comment( node, output )
when CData
write_cdata( node, output )
when Text
write_text( node, output )
else
raise Exception.new("XML FORMATTING ERROR")
end
end
やっと答えが見つかりました.コンテンツのフォーマットはnodeのタイプによって決まります.つまり、CDataオブジェクトを作成し、Textにこのオブジェクトを割り当てるだけで、documentはどのように出力するかを知っています.
_cdata = CData.new "select * from
(select rownum as r,s.* from
(select #{_field_as_attr*','} from #{@@table}"
_select_all.text=_cdata
このようにして出力されるxmlは「」に含まれます.上からwriteメソッドでは、Comment、DocType、XMLDeclなどの他のノードタイプを追加する場合、対応するオブジェクトを作成し、対応するオブジェクトに追加するだけで、対応するフォーマットが自然に生成されることがわかります.
この問題はほとんど自分の午前中の時間を費やして、rubyは以前も学んだことがありますが、ずっとあまり使っていないので、ほとんど忘れてしまいました.昨日本屋で偶然rubyの父松本行弘(この名前は覚えにくい)の松本行弘という本を見ました.そこで再び元のruby programmingを手に取って見てみると、2、3日で基本的にibatisを生成するsqlmapファイル、基本的なdao、service、domainなどを書くようになり、javaで書くよりも効率的になりました.それからネットでその<松本行弘のプログラムの世界>を买いました(ネットで7、5割引して邮便料金をプラスしないで、确かに本屋よりずっと安くて、私は新华书店で多くの本を买って、割引したことがありません).rubyは確かに面白い言語で、開発の過程でいつもいくつかの場所で自分を驚かせ、喜ばせます.これは他の言語を使ったことがありません.特にjavaはjavaでプログラムを開発するのがこんなに長いので、基本的には飽きています.
10.19:また、各elementの間に空白の改行文字を付けたい場合は、次のようにします.
<select id="getUserTypeNextId" resultClass="long">
</select>
<insert id="addUserType" parameterClass="userType">
</insert>
<update id="updateUserType" prameterClass="string">
</update>
<delete id="deleteUserType" parameterClass="string">
</delete>
この問題は本人が文書を見て、主にElementとDocumentの2つのクラスを見て、すべて何の収穫もなくて、そこで更にFormattersモジュールのPrettyを見て、パラメータが利用できることを発見していないで、ソースコードを変えるしかないようです.Prettyのwrite_を直接修正Elementメソッド:
def write_element(node, output)
.........
end
output << ">"
output << "
"
end
つまり、その要素の最後の行に改行を加えればいいのです.