Lors de la création de scripts Shell, les données se trouvent généralement dans des fichiers d’enregistrements à ligne unique tels que csv. C'est très simple de gérer ces données avec grep
et sed
. Mais comme je dois souvent traiter avec XML, j'aimerais vraiment un moyen de script pour accéder à ces données XML via la ligne de commande. Quels sont les meilleurs outils?
J'ai trouvé xmlstarlet assez bon pour ce genre de chose.
http://xmlstar.sourceforge.net/
Devrait être disponible dans la plupart des dépôts de distribution, aussi. Un tutoriel d'introduction est ici:
Quelques outils prometteurs:
nokogiri : analyse des DOM HTML/XML dans Ruby en utilisant les sélecteurs XPath et CSS
hpricot : obsolète
fxgrep : Utilise sa propre syntaxe XPath-like pour interroger des documents. Écrit en SML, l'installation peut donc être difficile.
LT XML : Boîte à outils XML dérivée d'outils SGML, comprenant sggrep
, sgsort
, xmlnorm
et d'autres. Utilise sa propre syntaxe de requête. La documentation est très formelle. Rédigé en C. LT XML 2 réclame le support de XPath, XInclude et d’autres normes W3C.
xmlgrep2 : recherche simple et puissante avec XPath. Écrit en Perl en utilisant XML :: LibXML et libxml2.
XQSharp : Prend en charge XQuery, l'extension de XPath. Écrit pour le .NET Framework.
xml-coreutils : La boîte à outils de Laird Breyer est équivalente à GNU coreutils. Discuté dans un essai = intéressant sur ce que la boîte à outils idéale devrait inclure.
xmldiff : Outil simple pour comparer deux fichiers XML.
xmltk : ne semble pas avoir de paquet dans debian, Ubuntu, Fedora ou macports, n'a pas eu de version sortie depuis 2007 et utilise une automatisation de construction non portable.
xml-coreutils semble être le mieux documenté et le plus orienté UNIX.
Il y a aussi xml2
et 2xml
paire. Cela permettra aux outils d'édition de chaînes habituels de traiter XML.
Exemple. q.xml:
<?xml version="1.0"?>
<foo>
text
more text
<textnode>ddd</textnode><textnode a="bv">dsss</textnode>
<![CDATA[ asfdasdsa <foo> sdfsdfdsf <bar> ]]>
</foo>
xml2 < q.xml
/foo=
/foo= text
/foo= more text
/foo=
/foo/textnode=ddd
/foo/textnode
/foo/textnode/@a=bv
/foo/textnode=dsss
/foo=
/foo= asfdasdsa <foo> sdfsdfdsf <bar>
/foo=
xml2 < q.xml | grep textnode | sed 's!/foo!/bar/baz!' | 2xml
<bar><baz><textnode>ddd</textnode><textnode a="bv">dsss</textnode></baz></bar>
P.S. Il y a aussi html2
/2html
.
À l'excellente liste de Joseph Holsten, j'ajoute le script de ligne de commande xpath fourni avec la bibliothèque Perl XML :: XPath. Un excellent moyen d'extraire des informations à partir de fichiers XML:
xpath -q -e '/entry[@xml:lang="fr"]' *xml
Vous pouvez utiliser xmllint:
xmllint --xpath //title books.xml
Devrait être livré avec la plupart des distributions, et est également livré avec Cygwin.
$ xmllint --version
xmllint: using libxml version 20900
Voir:
$ xmllint
Usage : xmllint [options] XMLfiles ...
Parse the XML files and output the result of the parsing
--version : display the version of the XML library used
--debug : dump a debug tree of the in-memory document
...
--schematron schema : do validation against a schematron
--sax1: use the old SAX1 interfaces for processing
--sax: do not build a tree but work just at the SAX level
--oldxml10: use XML-1.0 parsing rules before the 5th edition
--xpath expr: evaluate the XPath expression, inply --noout
Si vous recherchez une solution sous Windows, Powershell intègre des fonctionnalités de lecture et d'écriture XML.
test.xml:
<root>
<one>I like applesauce</one>
<two>You sure bet I do!</two>
</root>
Script Powershell:
# load XML file into local variable and cast as XML type.
$doc = [xml](Get-Content ./test.xml)
$doc.root.one #echoes "I like applesauce"
$doc.root.one = "Who doesn't like applesauce?" #replace inner text of <one> node
# create new node...
$newNode = $doc.CreateElement("three")
$newNode.set_InnerText("And don't you forget it!")
# ...and position it in the hierarchy
$doc.root.AppendChild($newNode)
# write results to disk
$doc.save("./testNew.xml")
testNew.xml:
<root>
<one>Who likes applesauce?</one>
<two>You sure bet I do!</two>
<three>And don't you forget it!</three>
</root>
Source: https://serverfault.com/questions/26976/update-xml-from-the-command-line-windows
Il y a aussi xmlsed & xmlgrep de NetBSD xmltools!
Cela dépend de ce que vous voulez faire.
XSLT peut être la voie à suivre, mais il y a une courbe d'apprentissage. Essayez xsltproc et notez que vous pouvez rendre les paramètres.
Il y a aussi saxon-lint
depuis la ligne de commande avec la possibilité d’utiliser XPath 3.0/XQuery 3.0. (D'autres outils en ligne de commande utilisent XPath 1.0).
http/html:
$ saxon-lint --html --xpath 'count(//a)' http://stackoverflow.com/q/91791
328
xml:
$ saxon-lint --xpath '//a[@class="x"]' file.xml
XQuery pourrait être une bonne solution. Il est (relativement) facile à apprendre et est une norme du W3C.
Je recommanderais XQSharp pour un processeur de ligne de commande.
J'ai d'abord utilisé xmlstarlet et je l'utilise toujours. Lorsque la requête devient difficile, j'ai besoin de XML xpath2 et xquery support technique je me tourne vers xidel http://www.videlibri.de/xidel.html