web-dev-qa-db-fra.com

Grep et Sed Équivalent pour le traitement en ligne de commande XML

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?

144
Joseph Holsten

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:

http://www.ibm.com/developerworks/library/x-starlet.html

101
Russ

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.

34
Joseph Holsten

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.

24
Vi.

À 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
23
bortzmeyer

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
12
Dave Jarvis

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

7
Clay

Il y a aussi xmlsed & xmlgrep de NetBSD xmltools!

http://blog.huoc.org/xmltools-not-dead.html

7
taggo

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.

5
Adrian Mouat

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).

EXEMPLES :

http/html:

$ saxon-lint --html --xpath 'count(//a)' http://stackoverflow.com/q/91791
328

xml:

$ saxon-lint --xpath '//a[@class="x"]' file.xml
3
Gilles Quenot

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.

2
Oliver Hallam

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

1
typelogic