1

私はこの問題を解決しようとして頭を悩ませてきました。この種の作業にスクリプト言語を使用するのはこれが初めてで、最初は難しい仕事を選んだのかもしれません。基本的に、私がしなければならないことは、いくつかの基本的な XML をより重い XML 構造に変換することです。

例 :

以下を翻訳します。

<xml>
  <test this="stuff">13141</test>
  <another xml="tag">do more stuff</another>
<xml>

これに:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Package>
<Package version="1.0">
  <tests>
    <test name="stuff">
      <information>13141</information>
    </test>
  </tests>
  <anothers>
    <another name="tag">
      <information>do more stuff</information>
    </another>
  </anothers>
</Package>

正規表現を介して手動で実行しようとしましたが、それは大変な作業です。たとえば、複数のテスト タグを配列に保存しようとしたので、2 番目の例のテスト タグに保存できますが、すべてを追跡することはできないようです。REXML と Hpricot を調べましたが、これを適切に行うための使用方法がわかりません。

つまり、基本的に、私が求めているのは、これをより効率的な方法で管理する方法について何かアイデアを持っている人はいますか?

4

3 に答える 3

2

XSLTを調べてください。私はこのテクノロジーに少しだけ精通していますが、その使用法はXMLドキュメントをある形式から別の形式に変換することです。これは必要なもののように聞こえます。

于 2009-08-14T15:23:27.310 に答える
1
require 'rubygems'
require 'hpricot'
require 'activesupport'

source = <<-XML
<xml>
<test this="stuff">13141</test>
<another xml="tag">do more stuff</another>
</xml>
XML

def each_source_child(source)
  doc = Hpricot.XML(source)

  doc.at('xml').children.each do |child|
    if child.is_a?(Hpricot::Elem)
      yield child
    end
  end
end

output = Hpricot.build do |doc|
  doc << '<?xml version="1.0" encoding="UTF-8"?>'
  doc << '<!DOCTYPE Package>'
  doc.tag! :Package, :version => '1.0' do |package|
    each_source_child(source) do |child|
      package.tag! child.name.pluralize do |outer|
        outer.tag! child.name, :name => child.attributes.values.first do |inner|
          inner.tag! :information do |information|
            information.text! child.innerText
          end
        end
      end
    end
  end
end

puts output

タグ間に空白はありません

于 2009-08-15T20:22:03.437 に答える
0

Hpricot と Builder を組み合わせると、探しているものが提供される場合があります。手順は次のとおりです。

  1. Hpricot で XML を読み込む
  2. 欲しい要素をピックアップ
  3. Hpricot の要素を繰り返し処理して、(Builder を介して) 新しい XML を吐き出します。
于 2009-08-14T15:26:28.630 に答える