Xml en ligne de commande : Différence entre versions
m |
m |
||
| Ligne 6 : | Ligne 6 : | ||
Langage Xpath : voir https://en.wikipedia.org/wiki/XPath | Langage Xpath : voir https://en.wikipedia.org/wiki/XPath | ||
| − | + | Exemple: récupérer le contenu de l'attribut value associé à thumbpoolsize dans le xml: | |
<syntaxhighlight lang="xml" line='line'> | <syntaxhighlight lang="xml" line='line'> | ||
| Ligne 17 : | Ligne 17 : | ||
$ xmllint --xpath 'string(/pdfsam/settings/thumbpoolsize/@value)' ./.pdfsam/pdfsam-config.xml | $ xmllint --xpath 'string(/pdfsam/settings/thumbpoolsize/@value)' ./.pdfsam/pdfsam-config.xml | ||
| − | + | Attention avec les namespaces, considérons le xml: | |
| − | |||
| − | considérons le xml: | ||
<syntaxhighlight lang="xml" line='line'> | <syntaxhighlight lang="xml" line='line'> | ||
| Ligne 42 : | Ligne 40 : | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| − | + | On veut récupérer la liste des attributs id associés à emItem, or | |
$ xmllint --xpath "//emItem/@id" /tmp/blocklist.xml | $ xmllint --xpath "//emItem/@id" /tmp/blocklist.xml | ||
XPath set is empty | 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]" | --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: | Alternative pour ignorer le namespace: passer par sed pour masquer l'attribut xmlns: | ||
| Ligne 57 : | Ligne 55 : | ||
id="{0F827075-B026-42F3-885D-98981EE7B1AE}" id="flvto@hotger.com" id="unblocker30__web@unblocker.yt" | id="{0F827075-B026-42F3-885D-98981EE7B1AE}" id="flvto@hotger.com" id="unblocker30__web@unblocker.yt" | ||
| − | + | Autre exemple: rehercher 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" | dans le xml ci-dessus, on veut le texte de versionRange pour le blockID="i1211" | ||
Version actuelle datée du 30 juillet 2018 à 09:31
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
Exemple: récupérer le contenu de l'attribut value associé à thumbpoolsize dans le xml:
1 <pdfsam config-version="2">
2 <settings>
3 <laf current-laf="1" current-theme="13"/>
4 <thumbpoolsize value="3"/>
avec la commande: $ xmllint --xpath 'string(/pdfsam/settings/thumbpoolsize/@value)' ./.pdfsam/pdfsam-config.xml
Attention avec les namespaces, considérons le xml:
1 <?xml version='1.0' encoding='UTF-8'?>
2 <blocklist lastupdate="1518640450735" xmlns="http://www.mozilla.org/2006/addons-blocklist">
3 <emItems>
4 <emItem blockID="i334" id="{0F827075-B026-42F3-885D-98981EE7B1AE}">
5 <prefs/>
6 <versionRange minVersion="0" maxVersion="*" severity="3"/>
7 </emItem>
8 <emItem blockID="i1211" id="flvto@hotger.com">
9 <prefs>test2
10 </prefs>
11 <versionRange minVersion="0" maxVersion="*" severity="1">this tetxdttdt</versionRange>
12 </emItem>
13 <emItem blockID="i1228" id="unblocker30__web@unblocker.yt">
14 <prefs/>
15 <versionRange minVersion="0" maxVersion="*" severity="3"/>
16 </emItem>
17 </emItems>
18 </blocklist>
On veut récupérer la liste des attributs id associés à emItem, or
$ 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"
Autre exemple: rehercher 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