rexmlにCDATAを追加

5682 ワード

最近rubyでibatis sqlmapを生成できるxmlファイルを書こうと思っていたのですが、以前は気づかなかったのですが、探してみると持参したパッケージの中にあったのですが、それがrexmlで、普通のテキストの内容を生成するのに問題なく、今日は突然いくつかのsql文を
では、結果は成功しませんでした.いずれにしても、「〈〉」という二つのカッコは転義され、ネットで探しても答えは見つからない.
やっと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

つまり、その要素の最後の行に改行を加えればいいのです.