2009-08-14 6 views
1

J'ai essayé de résoudre ce problème avec mon cerveau. C'est la première fois que j'utilise un langage de script pour ce genre de travail, et je suppose que j'ai peut-être choisi un travail difficile pour commencer. Essentiellement, ce que je dois faire est de transformer du XML de base en une structure XML plus lourde.Transformer les structures XML à l'aide de Ruby

Exemple:

Traduire ce qui suit:

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

Dans ceci:

<?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> 

J'ai essayé de le faire manuellement via regex, mais beaucoup de travail à faire . J'ai essayé de stocker, par exemple, plusieurs étiquettes de test dans un tableau, donc je peux les enregistrer dans la balise de test dans le second exemple, mais je n'arrive pas à garder une trace de tout. J'ai regardé REXML et Hpricot, mais je n'arrive pas à comprendre comment les utiliser correctement. En gros, ce que je demande, c'est: est-ce que quelqu'un a des idées sur la façon dont je pourrais gérer cela de façon plus efficace?

Répondre

2

Regardez dans XSLT. Je ne connais que très peu la technologie, mais son utilisation consiste à transformer des documents XML d'une forme à une autre, ce qui ressemble à ce dont vous avez besoin. Hpricot et Builder en combinaison peuvent fournir ce que vous cherchez.

+0

Merci, je vais examiner cela. – VirInvictus

+1

Ce type de travail est exactement ce que XSLT est pour. – dacracot

+0

Regardez Oxygen à partir de http://www.oxygenxml.com/ pour un IDE XSLT bien implémenté. Il a toutes les capacités de débogage que vous attendez d'un IDE professionnel et peut vraiment démarrer le processus d'apprentissage. – dacracot

0

Les étapes seraient:

  1. Lire en XML avec hpricot
  2. Choisissez ce quels éléments vous voulez
  3. crachez votre nouveau XML (par Builder) par itérer sur des éléments de hpricot
+0

Je vais aussi m'en occuper. Je vous remercie. – 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 

il n'y aura pas d'espaces entre les balises

Questions connexes