web-dev-qa-db-fra.com

Récupère xmllint pour générer les résultats xpath séparés par un sélecteur d'attribut

Comment puis-je obtenir que xmllint produise plusieurs résultats du sélecteur xpath pour les attributs "par ligne"?

Prenons cet exemple:

  <?xml version="1.0" encoding="ISO-8859-1"?>
  <config>
          <tagX key1="value1 " key2=" value2"/>
          <tagY key3="value3" key4=" value4 "/>
  </config>


  $ xmllint example.xml --xpath "/config/*/@*"

Le résultat est:

   key1="value1 " key2=" value2" key3="value3" key4=" value4 "

Ce que j'aimerais avoir, c'est:

   key1="value1 "
   key2=" value2"
   key3="value3"
   key4=" value4 "

Aurais-je besoin de séparer après les guillemets pairs, ou existe-t-il un moyen plus ordonné de procéder?

Il y a une question connexe, sur le même sujet sauf qu'il s'agit de choisir le contenu de <tag>value</tag>, et non de <tag attribute="value" />

20
SF.

Tu peux essayer:

$ xmllint --Shell inputfile <<< `echo 'cat /config/*/@*'`

Cependant, vous aurez peut-être besoin de grep la sortie afin de filtrer les lignes indésirables.

13
devnull

Si c'est une option, essayez plutôt d'utiliser xmlstarlet:

xmlstarlet sel -t -v "/config/*/@*" example.xml

3
tremby

La question est ancienne mais lorsque je suis arrivé à ce poste en cherchant une solution au même problème, voici ma solution

Sur linux, ajoutez la substitution sed à la sortie divisée:

$ xmllint example.xml --xpath "/config/*/@*" | sed "s| key|\nkey|g"

bien entendu, l'expression de substitution dépend de votre structure XML et de votre requête xpath.

Et vous pouvez même ajouter des numéros de ligne sur chaque ligne si vous ajoutez nl

$ xmllint example.xml --xpath "/config/*/@*" | sed "s| key|\nkey|g" | nl

Qui donne 

   1 key1="value1 "
   2 key2=" value2"
   3 key3="value3"
   4 key4=" value4 "
1
Dumitru

Si vous utilisez la dernière version de xmllint, les résultats doivent maintenant être séparés par \n. Toutefois, si les champs contiennent \n, vous pouvez utiliser ce patched version pour utiliser \0 en tant que séparateur, avec --xpath0. Pour une raison quelconque, le PR n'a pas encore été fusionné.

0
Cyker