J'utilise depuis peu un logiciel en Shell pour parser une URL XML et obtenir une valeur suivant un path.
Ce logiciel fonctionné très bien (avec quelques réglages sed pour nettoyer le résultat. Cependant, sans rien avoir changé de mon fichier XML ni de ma ligne Shell, ca ne fonctionne plus.
J'utilise xmllint pour parser ce fichier par cette manière :
echo "cat mod_cband/Users/mick/usages/total" | xmllint http://localhost/cband-status?xml
Où 'mick' est un User et l'adresse HTTP, le lien pour accéder aux données d'un trafic Web monitoré par cband (un module Apache).
Voici ce que xmllint me retourne maintenant :
http://localhost/cband-status?xml:216: parser error : StartTag: invalid element name
^
http://localhost/cband-status?xml:234: parser error : expected '>'
^
http://localhost/cband-status?xml:234: parser error : Opening and ending tag mismatch: Virtualhosts line 6 and unparseable
^
http://localhost/cband-status?xml:4339: parser error : StartTag: invalid element name
^
http://localhost/cband-status?xml:4357: parser error : expected '>'
^
http://localhost/cband-status?xml:4357: parser error : Opening and ending tag mismatch: mod_cband line 2 and unparseable
^
http://localhost/cband-status?xml:4357: parser error : Extra content at the end of the document
Il semble bloquer lorsque les balises XML débutent par un nombre. J'ai fais l'essai pour générer cette config XML avec une lettre et ainsi, fausser le 'ServerName' ainsi que les identifiants et ca marche ... Mais plus rien ne fonctionne au niveau Apache étant donné que les 'ServerName' (adresse Web) ne sont plus les mêmes.
Modifier ce fichier de cette manière à chaque parse XML est possible mais c'est une perte de temps incroyable.
Le plus étrange est que j'ai toujours eux des adresses commendant par des nombres et que xmllint n'a jamais toussé.
Deux questions :
- Avez vous une solution à xmllint ?
- Auriez vous une autre application (non pas pour valider le xml comme le fait xmllint) mais un parseur XML XPath en Shell ?
Merci d'avance
# Résolu
Posté par Elodie . Évalué à 2.
wget http://localhost/cband-status?xml --output-document=/tmp/cband-status.xml
cat /tmp/cband-status.xml | tail +2 | sed 's/<\//_\/x/g' | sed 's/</<x/g' | sed 's/_\/x/<\/x/g' > /tmp/cband-status2.xml
mv /tmp/cband-status2.xml /tmp/cband-status.xml
Il me suffit ensuite à parser le fichier sur disque.
Ces 3 lignes ne prennent pas plus de 2 secondes et je pense que mon parse est accéléré par la suite.
[^] # Re: Résolu
Posté par Léa GRIS . Évalué à 1.
wget -qO- http://localhost/cband-status?xml | tail +2 | sed 's/<\//_\/x/g' | sed 's/</<x/g' | sed 's/_\/x/<\/x/g' > /tmp/cband-status.xml
C'est un peu plus court avec un fichier temporaire et un en moins. À ce stade, ou seraient peut-être plus appropriés pour ces manipulations, d'autant que ces langages disposent de modules adaptés au traitement XML.Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.