2009-10-12 10 views
3

Supposons que j'ai cette structure:Comment puis-je supprimer des noeuds XML en double en utilisant Ruby?

<one> 
    <two> 
    <three>3</three> 
    </two> 

    <two> 
    <three>4</three> 
    </two> 

    <two> 
    <three>3</three> 
    </two> 
</one> 

est-il de toute façon de se rendre à ceci:

<one> 
    <two> 
    <three>3</three> 
    </two> 

    <two> 
    <three>4</three> 
    </two> 

</one> 

en utilisant les bibliothèques de Ruby? J'ai réussi à obtenir this en utilisant Nokogiri. D'après mes tests, cela semble fonctionner, mais il y a peut-être une autre approche, une meilleure.

+0

cool question ... – khelll

Répondre

5

Que diriez-vous d'un qui fait le tout dans deux lignes?

seen = Hash.new(0) 
node.traverse {|n| n.unlink if (seen[n.to_xml] += 1) > 1} 

S'il y a une possibilité de le même nœud apparaissant sous les deux parents différents, et vous ne le font pas voulez que ces être considérés comme des doublons, vous pouvez changer cette deuxième ligne:

node.traverse {|n| n.unlink if (seen[(n.parent.path rescue "") + n.to_xml] += 1) > 1} 
+0

Voulez-vous s'il vous plaît coller toute la solution suggérée? – khelll

+0

Excellente solution! On dirait que j'ai surchargé le mien: D – Geo

+0

Voilà toute la solution. Autre que d'exiger Nokogiri et de définir le noeud = Nokogiri :: XML (données), comme dans son exemple de code. –

0

Cette page explique parsing XML dans Ruby un petit peu http://developer.yahoo.com/ruby/ruby-xml.html

Cette page explique quelques-unes des raisons pour lesquelles vous souhaitez utiliser un analyseur syntaxique sur quelque chose comme des expressions régulières: http://htmlparsing.icenine.ca

En bref, l'approche que vous utilisez ne semble pas horrible.

+0

J'utilise un analyseur XML ici. Nokogiri. – Geo

+0

Oui, je n'ai jamais utilisé Nokogiri. Je voulais dire que cette réponse était plus un moyen de fournir des suggestions sur d'autres parseurs dont j'ai entendu parler. J'ai inclus le site web htmlparsing hors de portée de l'habitude. Je réponds beaucoup trop de questions d'analyse syntaxique tous les jours sur IRC. Pardon. :) – genio

Questions connexes