Xml en ligne de commande : Différence entre versions

De TechWik
Aller à : navigation, rechercher
(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
 
(2 révisions intermédiaires par le même utilisateur non affichées)
Ligne 6 : Ligne 6 :
 
Langage Xpath : voir https://en.wikipedia.org/wiki/XPath
 
Langage Xpath : voir https://en.wikipedia.org/wiki/XPath
  
# récupérer le contenu de l'attribut value associé à thumbpoolsize dans le xml suivant:  
+
Exemple: récupérer le contenu de l'attribut value associé à thumbpoolsize dans le xml:  
  
 +
<syntaxhighlight lang="xml" line='line'>
 
   <pdfsam config-version="2">
 
   <pdfsam config-version="2">
 
     <settings>
 
     <settings>
 
       <laf current-laf="1" current-theme="13"/>
 
       <laf current-laf="1" current-theme="13"/>
 
       <thumbpoolsize value="3"/>
 
       <thumbpoolsize value="3"/>
 
+
</syntaxhighlight>
 
   avec la commande:
 
   avec la commande:
 
   $ xmllint --xpath 'string(/pdfsam/settings/thumbpoolsize/@value)' ./.pdfsam/pdfsam-config.xml
 
   $ xmllint --xpath 'string(/pdfsam/settings/thumbpoolsize/@value)' ./.pdfsam/pdfsam-config.xml
  
# problème avec les namespaces
+
Attention avec les namespaces, considérons le xml:  
 
 
considérons le xml:  
 
  
 +
<syntaxhighlight lang="xml" line='line'>
 
   <?xml version='1.0' encoding='UTF-8'?>
 
   <?xml version='1.0' encoding='UTF-8'?>
 
   <blocklist lastupdate="1518640450735" xmlns="http://www.mozilla.org/2006/addons-blocklist">
 
   <blocklist lastupdate="1518640450735" xmlns="http://www.mozilla.org/2006/addons-blocklist">
Ligne 38 : Ligne 38 :
 
     </emItems>
 
     </emItems>
 
   </blocklist>
 
   </blocklist>
 +
</syntaxhighlight>
  
si on veut récupérer la liste des attributs id associés à emItem,
+
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  
+
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.  
+
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 54 : 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"
  
# chercher dans un item particulier d'une liste a partir d'une valeur d'attribut
+
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"
Ligne 60 : Ligne 61 :
 
   $ 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 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