2009-12-11 3 views
15

Je recherche un moyen d'extraire et d'imprimer un élément de mon fichier XML à l'aide de xmlstarlet; par exemple, si mon xml estExtraction et vidage d'éléments à l'aide de xmlstarlet

<?xml version="1.0" encoding="ISO-8859-1"?> 

<bookstore> 

<book> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
</book> 

<book> 
    <title lang="eng">Learning XML</title> 
    <price>39.95</price> 
</book> 

</bookstore> 

Je voudrais imprimer élément livre avec prix = 29.99 comme:

<book> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
</book> 

Je comprends la requête XPath pour sélectionner un tel élément (/ librairie/livre [ prix = 29,99]) mais Je ne suis pas en mesure d'imprimer/vider sur stdout. Si j'utilise l'option '-v' et que j'utilise -v (.) Je n'obtiens pas la sortie comme je le veux (avec toutes les balises dedans) je viens d'obtenir les valeurs de texte. Il devrait y avoir un moyen de simplement jeter l'élément sélectionné tel quel, et c'est ce que je cherche.

Merci d'avance.

Répondre

15

Utilisation de la « -c » (copie) option devrait permettre d'atteindre ce que vous êtes après:

xmlstarlet sel -t -c "/bookstore/book[price=29.99]" books.xml 

<book> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
</book> 

Vous pouvez regarder le XSLT généré en interne dans xmlstarlet en ajoutant le global « C » interrupteur après " sel ". Cela montre comment les résultats de l'option de copie dans une copie xslt-de construction:

... 
<xsl:template name="t1"> 
    <xsl:copy-of select="/bookstore/book[price=29.99]"/> 
</xsl:template> 
... 

Il en résulte des espaces de noms, les nœuds enfants, et les attributs noeuds étant inclus, cf. la spécification XSLT (see w3schools summary).

+0

Merci pour cela, cela a fonctionné! – shrijeet

+0

Doit changer un nombre de caractères, pour échapper à la limite de modification minimale de 6 caractères. ne fonctionnerait pas pour moi à moins que je mette le @ en face de l'attribut, à savoir @ prix = 29,99 plutôt que le prix = 29,99 –

+0

Merci .. j'ai passé un mois à chercher ce commutateur -c. – ifelsemonkey

Questions connexes