1

私は現在、REXML を使用して XML ファイルを解析しており、内部ファイルから XML フラグメントを挿入する方法を考え出そうとしています。

現在、次のようなロジックを使用しています。

doc.elements.each('//include') do |element|
  handleInclude( element )
end

def handleInclude( element )      
  if filename = element.attributes['file']
    data = File.open( filename ).read
    doc = REXML::Document.new( data )
    element.parent.replace_child( element, doc.root )
  end
end

私のXMLは次のようになります。

<include file="test.xml" />

しかし、これは少しぎこちないように思えます。適切なルート ノードが存在しない場合があるため、REXML が XML フラグメントを常に正しく解析するとは限らないのではないかと心配しています。これを行うより良い方法はありますか?

4

1 に答える 1

2

現在、人工的なルート要素を作成し、次のような一連の挿入/削除を行うことで、これを機能させる方法を見つけました。

  doc = REXML::Document.new( "<include>#{data}</include>" )
  previous_element = element
  doc.root.elements.each do |child|
    element.parent.insert_after( previous_element, child )
    previous_element = child
  end
  element.parent.delete( element )

もっと良い方法があるはずだと感じさせます。

于 2010-05-25T06:38:07.547 に答える