2009-08-14 14 views
1

私はこの問題を解決しようとしている私の頭を悩ましてきました。このような作業にスクリプト言語を使用したのはこれが初めてのことです。まず始めに仕事を選ぶかもしれないと思います。基本的には、基本的なXMLをより重いXML構造に変換するだけです。Rubyを使用して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番目の例ではtestsタグに保存できますが、すべてを把握できないようです。私はREXMLとHpricotを調べましたが、これを正しく使用するためにそれらを使用する方法を理解することはできません。

基本的に、私が求めているのは、誰かが私がこれをより効率的な方法でどのように管理できるかについてのアイデアはありますか?

答えて

2

XSLTを調べます。私は技術に精通しているだけですが、XML文書をある形式から別の形式に変換することが必要です。

+0

ありがとう、私はこれを調べます。 – VirInvictus

+1

この種の作業は、XSLTのためのものです。 – dacracot

+0

うまく実装されたXSLT IDEについてはhttp://www.oxygenxml.com/のOxygenを見てください。これは、プロフェッショナルIDEから期待されるすべてのデバッグ機能を備えており、実際に学習プロセスを開始することができます。 – dacracot

0

HpricotとBuilderが組み合わさって、あなたが探しているものが得られるかもしれません。手順は次のようになります。

  1. 読むHpricot
  2. とXMLにあなたはHpricot
+0

私はこれも調べます。ありがとうございました。 – VirInvictus

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 
からの要素を反復によって(ビルダを介して)新しいXMLを吐き出す
  • を望むものの要素アウト選びます

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

  • 関連する問題