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" />
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.
Si c'est une option, essayez plutôt d'utiliser xmlstarlet:
xmlstarlet sel -t -v "/config/*/@*" example.xml
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 "
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é.