[R] Parser install.rdf (XML) des extensions Mozilla

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
giHefca
Niveau 1
Niveau 1
Messages : 11
Enregistré le : mer. 07 mars 2012 12:26
Status : Hors ligne

[R] Parser install.rdf (XML) des extensions Mozilla

#1

Message par giHefca »

Bonjour,

j'ai besoin de parser le fichier install.rdf qui se trouve dans les extensions Mozilla afin de récupérer son id
Le fichier install.rdf est un fichier XML et je souhaite récupérer ce qui est en rouge gras.
J'ai bien essayé d'utiliser le parser XML de cette page http://www.autoitscript.com/forum/topic ... apper-com/ mais sans vraiment comprendre comment ça fonctionne :(

Si vous avez une solution, je suis preneur :)

Contenu du fichier install.rdf

Code : Tout sélectionner

<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
  <Description about="urn:mozilla:install-manifest">
    <em:id>[b][color=#FF0000]{972ce4c6-7e08-4474-a285-3208198ce6fd}[/color][/b]</em:id>
    <em:version>9.0.1</em:version>
    <!-- Target Application this theme can install into, 
        with minimum and maximum supported versions. --> 
    <em:targetApplication>
      <Description>
        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
        <em:minVersion>9.0.1</em:minVersion>
        <em:maxVersion>9.0.1</em:maxVersion>
      </Description>
    </em:targetApplication>
    <!-- Front End MetaData -->
    <em:name>Default</em:name>
    <em:description>The default theme.</em:description>
    <!-- Front End Integration Hooks (used by Theme Manager)-->
    <em:creator>Mozilla</em:creator>
    <em:contributor>Mozilla Contributors</em:contributor>
    <!-- Allow lightweight themes to apply to this theme -->
    <em:skinnable>true</em:skinnable>
    <em:internalName>classic/1.0</em:internalName>
  </Description>      
</RDF>
 


Solution

Code : Tout sélectionner

#include <_XMLDOMWrapper.au3>
msgbox(0,"install.rdf id",_ParseRDF("install.rdf"))

Func _ParseRDF($file)
   $xmlFile = FileRead($file)
   $xmlFile = StringReplace($xmlFile,'xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"',"")
   $xmlNamespace = 'xmlns:em="http://www.mozilla.org/2004/em-rdf#"'
   If _XMLLoadXML($xmlFile, $xmlNamespace) Then
   $ret = _XMLGetValue("/RDF/Description/em:id")
   If UBound($ret)<>2 Then Return False
   Return $ret[1]
   EndIf
   Return False
EndFunc
 
Modifié en dernier par giHefca le ven. 27 avr. 2012 22:43, modifié 1 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Parser install.rdf (XML) des extensions Mozilla

#2

Message par mikell »

Code : Tout sélectionner

$rdf = FileRead("test.rdf")
$txt = StringRegExpReplace($rdf, '(?s)(.*?)<em:id>(.*?)</em:id>.+', "$2")
Msgbox(0,"", $txt)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
giHefca
Niveau 1
Niveau 1
Messages : 11
Enregistré le : mer. 07 mars 2012 12:26
Status : Hors ligne

Re: [..] Parser install.rdf (XML) des extensions Mozilla

#3

Message par giHefca »

Merci pour cette réponse rapide :)

J'avais pensé à utiliser les regex (bien que je n'y connaisse rien non plus :oops: ) mais le problème est qu'il peut exister plusieurs instance de <em:id> (pour les extensions requises par exemple) et que le <em:id> que je cherche n'est pas forcément au même endroit dans le fichier

Exemple de fichier avec plusieurs em:id le bon étant en rouge
Le seule moyen fiable de le trouver, c'est de se baser sur la hiérarchisation XML

Code : Tout sélectionner

<RDF ...>
[...]
<Description ...>
[...]
<em:id>

Code : Tout sélectionner

<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
  <Description about="urn:mozilla:install-manifest">
    <!-- Target Application this extension can install into, 
        with minimum and maximum supported versions. --> 
    <em:targetApplication>
      <Description>
        <!-- thunderbird -->
        [color=#40BF00][b]<em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>[/color][/b]
        <em:minVersion>1.5</em:minVersion>
        <em:maxVersion>3.1.*</em:maxVersion>
      </Description>
    </em:targetApplication>
    [color=#FF0000][b]<em:id>{9C463B6A-CCBE-11DB-97FC-FBC955D89593}</em:id>[/color][/b]
    <em:name>printers</em:name>
    <em:type>2</em:type>
    <em:version>0.4.9</em:version>
    <em:optionsURL>chrome&#058;//fgprinters/content/options.xul</em:optionsURL>
    <em:description>Adds additional print options</em:description>
    <em:creator>Ferdinand Grassmann</em:creator>
    <em:homepageURL>http://www.grassmann.info/ferdinand</em:homepageURL>
    <em:requires>
      <Description>
        <!-- Lightning -->
        [color=#40BF00][b]<em:id>{e2fda1a4-762b-4020-b5ad-a41df1933103}</em:id>[/b][/color]
        <em:minVersion>0.9</em:minVersion>
        <em:maxVersion>1.0pre</em:maxVersion>
      </Description>
    </em:requires>
    <em:targetApplication>
      <Description>
        <!-- Sunbird -->
        [b][color=#40BF00]<em:id>{718e30fb-e89b-41dd-9da7-e25a45638b28}</em:id>[/color][/b]
        <em:minVersion>0.9</em:minVersion>
        <em:maxVersion>1.0pre</em:maxVersion>
      </Description>
    </em:targetApplication>
  </Description>
</RDF>
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

Re: [..] Parser install.rdf (XML) des extensions Mozilla

#4

Message par PandiPanda »

Bonjour,

vous pouvez toujours récuperer TOUTE les valeurs possible et la ca sera a vous de choisir la "bonne"

Code : Tout sélectionner

#Include <Array.au3>

$rdf = FileRead("test.rdf")
$txt = StringRegExp($rdf, '(?s)(?i)<em:id>(.*?)</em:id>',3)
_ArrayDisplay($txt)

For $i=0 To UBound($txt)-1
    MsgBox(0,"",$txt[$i])
    ; votre condition et vous choississez le bon
Next
Si la condition se base sur ce qu'il y'a avant ou après votre valeur recherchée et non sur son "contenu"
dans ce cas va falloir être plus précis pour y adapter le regex ^^
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Parser install.rdf (XML) des extensions Mozilla

#5

Message par mikell »

Ben il va falloir trouver un moyen de repérer l'id dans ton xml de manière constante ^^
par exemple ce code

Code : Tout sélectionner

$rdf = FileRead("test.rdf")
$rdf = StringRegExpReplace($rdf, '(?s)(.*?)</Description>(.+)', "$2")
$txt = StringRegExpReplace($rdf, '(?s)(.*?)<em:id>(.*?)</em:id>.+', "$2")
Msgbox(0,"", $txt)
répond pour l'instant à ton cahier des charges, mais les conditions seront-elles les mêmes pour d'autres xml ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
giHefca
Niveau 1
Niveau 1
Messages : 11
Enregistré le : mer. 07 mars 2012 12:26
Status : Hors ligne

Re: [..] Parser install.rdf (XML) des extensions Mozilla

#6

Message par giHefca »

J'ai testé ce code sur quelques extensions, certaines n'ont pas fonctionné, l'arborescence du fichier est vraiment aléatoire :(

J'ai trouvé une solution en utilisant le parser XML, en me basant sur le code de PsaltyDS (http://www.autoitscript.com/forum/topic ... _p__798829)
Vu qu'il se base sur l'arborescence, il n'y a pas d'erreur

Merci de vous être penché sur mon cas, ça m'a décidé à regarder de plus près les regex :)

Code : Tout sélectionner

#include <_XMLDOMWrapper.au3>
msgbox(0,"install.rdf id",_ParseRDF("install.rdf"))

Func _ParseRDF($file)
   $xmlFile = FileRead($file)
   $xmlFile = StringReplace($xmlFile,'xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"',"")
   $xmlNamespace = 'xmlns:em="http://www.mozilla.org/2004/em-rdf#"'
   If _XMLLoadXML($xmlFile, $xmlNamespace) Then
   $ret = _XMLGetValue("/RDF/Description/em:id")
   If UBound($ret)<>2 Then Return False
   Return $ret[1]
   EndIf
   Return False
EndFunc
 

Pour information et si ça peut aider quelqu'un d'autre, ce code va me servir à installer de manière automatique des extensions Firefox ou Thunderbird (version 3.x) pour tout les utilisateurs d'un PC
Le script va décompresser le fichier .xpi (qui est un simple zip) dans le répertoire C:\Program Files\Mozilla Firefox (ou Thunderbird)\Extensions et renommer le répertoire avec l'id que ce code récupère
Répondre