2009-07-16 9 views
1

J'essaie d'analyser les valeurs d'un widget config.xml en utilisant shell. Je veux utiliser sed pour cette tâche. S'il y a quelque chose que xsltproc, je serais ravi de savoir.Accéder aux attributs de XML dans le shell

Dans cet exemple, je suis après l'id valeur d'attribut du config.xml ci-dessous:

<?xml version="1.0" encoding="UTF-8"?> 
<widget xmlns="http://www.w3.org/ns/widgets" id="http://example.org/exampleWidget" version="2.0 Beta" height="200" width="200"> 
<name short="123">Foo Widget</name> 
</widget> 

Je souhaite qu'il était aussi simple que Jquery's attr: var id = $("widget").attr("id");

Actuellement ce code shell en utilisant xsltproc échoue:

snag() { 
TMP=$(tempfile) 
cat <<EOF> $TMP 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="text" encoding="utf-8" indent="no"/> 
<xsl:template> 
<xsl:value-of select="$1"/> 
</xsl:template> 
</xsl:stylesheet> 
EOF 

echo $(xsltproc $TMP config.xml) 
rm -f $TMP 
} 

ID=$(snag "widget/@id") 

if test "$ID" = "http://example.org/exampleWidget" 
then 
    echo Mission accomplished. 
else 
    echo "<$ID> is wrong." 
fi 

Répondre

1

xmlstarlet (http://xmlstar.sourceforge.net/) est un outil de ligne de commande nice qui prend en charge ces requêtes:

xmlstarlet sel -N w = espace de noms -T -t -m "/ w: widget/@ id" -v. -n config.xml

+0

Avez-vous essayé cette commande? Cela ne marche pas pour moi sur 1.0.1. – hendry

+0

J'ai oublié l'espace de nom du widget au premier essai. Vous devez remplacer 'namespace' par la valeur de votre xml, Stackoverflow ne permettra pas aux nouveaux utilisateurs de coller plus d'une URL. –

+0

Comme c'est extraordinaire, ça marche. 'hendry @ x61 shell $ xmlstarlet sel -N w =" http://www.w3.org/ns/widgets "-T -t -m"/w: widget/@ id "-v. -n config.xml http: // webvm.net/widgets/123' Cependant il y a une aboniation des commutateurs là. Insensé!! – hendry

0

modèle m atch = "widget"

sélectionnez la valeur de = "@ id"

0

< xsl: xmlns modèle: WGT = correspondance "http://www.w3.org/ns/widgets" = "/ WGT : un widget "> < xsl: sélectionnez la valeur de =" @ id »/> </xsl: template>

+0

hendry @ x61 shell $ sh foo.sh \t/tmp/file3jey7M: 3: erreur analyseur: valeur mandat de spécification pour l'attribut de valeur de \t \t \t \t \t \t \t^ \t/tmp/file3jey7M: 3: erreur d'analyse: attributs construire erreur \t \t \t \t \t \t \t^ \t/tmp/file3jey7M: 3: erreur d'analyse: Couldn » t trouver la fin de Start Tag sélectionner l ine 3 \t \t \t \t \t \t \t^ \t ne peut pas analyser/tmp/file3jey7M – hendry

0

Vous n'avez pas besoin de XSLT si vous ne faites pas de transformation. Si vous avez seulement besoin de saisir une valeur, utilisez XPath.

Il existe un programme xpath fourni avec le module XML :: XPath de Perl.

À partir du shell:. ID = $ ('string (/ widget/id @)' XPath config.xml)

(La fonction string() est d'obtenir que la valeur de l'identifiant

/widget/@ id retourne par lui-même « id = valeur »)

Si vous avez seulement besoin de produire une autre sortie en fonction de la valeur, vous pouvez tout faire en xslt. Il existe également d'autres implémentations XPath disponibles à partir de autres langages de script: J'ai utilisé XPath de Java à la fois de rhino et de Jython. Il y a aussi XQuery depuis la ligne de commande avec Saxon.

+0

Xpath semble vraiment lourd comparé à 'xmlstarlet'. – hendry

Questions connexes