est ici la beauté de l'aide d'un analyseur tel que Nokogiri:
Cela vous permet de manipuler des balises sélectionnées (nœuds) et leurs attributs:
require 'nokogiri'
xml = <<EOT
<xml>
<Image ImagePath="path/to/image">image comment</Image>
<Text TextFont="courier" TextSize="9">this is the text</Text>
</xml>
EOT
doc = Nokogiri::XML(xml)
doc.search('Image').each do |n|
n.name = 'img'
n.attributes['ImagePath'].name = 'path'
end
doc.search('Text').each do |n|
n.name = 'txt'
n.attributes['TextFont'].name = 'font'
n.attributes['TextSize'].name = 'size'
end
print doc.to_xml
# >> <?xml version="1.0"?>
# >> <xml>
# >> <img path="path/to/image">image comment</img>
# >> <txt font="courier" size="9">this is the text</txt>
# >> </xml>
Si vous devez parcourir tous les nœuds, peut-être à faire une transformation universelle sur l'étiquette-nom, vous pouvez utiliser doc.search('*').each
. Ce serait plus lent que de rechercher des tags individuels, mais cela pourrait entraîner moins de code si vous devez changer chaque tag. La bonne chose à propos de l'utilisation d'un analyseur est qu'il fonctionnera même si la disposition du XML change car il ne se soucie pas des espaces, et fonctionnera même si l'ordre des attributs change, rendant votre code plus robuste.
* Qu'est-ce que je fais mal ici? * Snide, mais réponse sérieuse 1: ne pas utiliser un processeur XML. Snide, mais réponse sérieuse 2: [deux problèmes] (http://www.codinghorror.com/blog/2008/06/regular-expressions-now-you-have-two-problems.html). Snide, mais réponse sérieuse 3: ces changements vont probablement avoir une très petite diminution de la taille. Considérons un conteneur (gzip) ou un compresseur XML binaire, si * vraiment * est nécessaire. Codage heureux. –
@pst: Oui, monsieur. Cependant, j'ai besoin de ce script non seulement pour XML mais aussi pour d'autres formats (partiellement personnalisés), donc un processeur XML ne le coupera pas. Une remarque encore plus correcte serait en fait «4: utiliser XML en premier lieu». Quelque chose comme JSON résoudrait tous mes problèmes à la rigueur - mais quand j'ai proposé cela, mes patrons l'ont rejeté. Triste mais vrai. – bastibe
Comment pourrais-je oublier # 4? :(Heureux codage dans les confinements de boss –