Xml en ligne de commande : Différence entre versions
(Page créée avec « = xmllint, xmlstarlet = xmllint analyse un ou plusieurs fichiers XML (paramètres de la ligne de commande ou entrée standard). Il permet de valider le document ou d'en ex... ») |
m |
||
| Ligne 60 : | Ligne 60 : | ||
$ sed 's/xmlns/ignore/' /tmp/blocklist.xml | xmllint --xpath '/blocklist/emItems/emItem[@blockID="i1211"]/versionRange/text()' - | $ sed 's/xmlns/ignore/' /tmp/blocklist.xml | xmllint --xpath '/blocklist/emItems/emItem[@blockID="i1211"]/versionRange/text()' - | ||
this tetxdttdt | this tetxdttdt | ||
| + | |||
| + | [[Category:Linux]] | ||
| + | [[Category:XML]] | ||
Version du 21 février 2018 à 17:09
xmllint, xmlstarlet
xmllint analyse un ou plusieurs fichiers XML (paramètres de la ligne de commande ou entrée standard). Il permet de valider le document ou d'en extraire des données (avec XPATH).
xmlstarlet est un autre outil en ligne de commande avec pas mal d'options.
Langage Xpath : voir https://en.wikipedia.org/wiki/XPath
- récupérer le contenu de l'attribut value associé à thumbpoolsize dans le xml suivant:
<pdfsam config-version="2">
<settings>
<laf current-laf="1" current-theme="13"/>
<thumbpoolsize value="3"/>
avec la commande: $ xmllint --xpath 'string(/pdfsam/settings/thumbpoolsize/@value)' ./.pdfsam/pdfsam-config.xml
- problème avec les namespaces
considérons le xml:
<?xml version='1.0' encoding='UTF-8'?> <blocklist lastupdate="1518640450735" xmlns="http://www.mozilla.org/2006/addons-blocklist"> <emItems> <emItem blockID="i334" id="{0F827075-B026-42F3-885D-98981EE7B1AE}"> <prefs/> <versionRange minVersion="0" maxVersion="*" severity="3"/> </emItem> <emItem blockID="i1211" id="flvto@hotger.com"> <prefs>test2 </prefs> <versionRange minVersion="0" maxVersion="*" severity="1">this tetxdttdt</versionRange> </emItem> <emItem blockID="i1228" id="unblocker30__web@unblocker.yt"> <prefs/> <versionRange minVersion="0" maxVersion="*" severity="3"/> </emItem> </emItems> </blocklist>
si on veut récupérer la liste des attributs id associés à emItem,
$ xmllint --xpath "//emItem/@id" /tmp/blocklist.xml XPath set is empty
l'erreur vient du namespace utilisé dans le document. Il n'y a pas moyen de le spécifiersur la ligne de commande, et il faudrait utiliser le xpath
--xpath "//*[namespace-uri()='http://www.mozilla.org/2006/addons-blocklist' and local-name()='emItem'/@id]"
et s'il ya plusieurs étages de paramètres, répéter namespace-uri()= ... and local-name()= pour chacun.
Alternative pour ignorer le namespace: passer par sed pour masquer l'attribut xmlns:
$ sed 's/xmlns/ignore/' /tmp/blocklist.xml | xmllint --xpath "//emItem/@id" -
id="{0F827075-B026-42F3-885D-98981EE7B1AE}" id="flvto@hotger.com" id="unblocker30__web@unblocker.yt"
- chercher dans un item particulier d'une liste a partir d'une valeur d'attribut
dans le xml ci-dessus, on veut le texte de versionRange pour le blockID="i1211"
$ sed 's/xmlns/ignore/' /tmp/blocklist.xml | xmllint --xpath '/blocklist/emItems/emItem[@blockID="i1211"]/versionRange/text()' - this tetxdttdt