1
votes

I am trying to parse a XML file with xmlstarlet (using xpath), but I get a syntax error and I don't know how to correct my code.

This is my script:

#!/bin/bash

if [ $1=="author" ]; then
    xmlstarlet sel  -t -v //topic/auteur[text()=$2]/../titre < ~/.jvc/topics.xml
fi

And this is the XML file:

<liste_topics>
  <topic>
    <icone>topic_marque_on</icone>
    <auteur>Knakis</auteur>
    <titre>Vos bureaux</titre>
    <auteur_en_rouge>0</auteur_en_rouge>
    <nb_reponses>1036</nb_reponses>
    <lien_topic>jv://forums/1-38-7790682-1-0-1-0-0.xml</lien_topic>
    <date_heure>29/08/2014 - 12h56</date_heure>
  </topic>
  <topic>
    <icone>topic_marque_on</icone>
    <auteur>ShadowwF</auteur>
    <titre>[PROJET] Le wiki du forum v2</titre>
    <auteur_en_rouge>0</auteur_en_rouge>
    <nb_reponses>198</nb_reponses>
    <lien_topic>jv://forums/1-38-7796926-1-0-1-0-0.xml</lien_topic>
    <date_heure>17/08/2014 - 15h16</date_heure>
  </topic>
  <topic>
    <icone>topic_marque_off</icone>
    <auteur>Google_Bot</auteur>
    <titre>[À lire] Répondre aux trolls = kick</titre>    
    <nb_reponses>0</nb_reponses>
    <lien_topic>jv://forums/1-38-7818336-1-0-1-0-0.xml</lien_topic>
    <date_heure>14/08/2014 - 03h33</date_heure>
  </topic>
</liste_topics>

I want to print the text between the "titre" tag which author (text between "auteur value") is the second parameter. For example, if I enter ./my_script author Knakis, I want it to return :

Vos bureaux 

Thanks for your help :)

1
Use spaces for the elements within [ ]: if [ $1 == "author" ]; then.fedorqui 'SO stop harming'
What is it supposed to do ? I did it but it changed nothingnounoursheureux

1 Answers

2
votes

I have only xmllint:

#!/bin/bash

if [ "$1" == "author" ]; then
  xmllint --xpath "//liste_topics/topic[auteur=\"$2\"]/titre/text()" file.xml
fi

Output:

 Vos bureaux