Grep et L'équivalent Sed pour le traitement en ligne de commande XML

lors de l'exécution de scripts shell, typiquement les données seront dans des fichiers d'enregistrements de ligne simple comme csv. Il est très simple de traiter ces données avec grep et sed . Mais je dois traiter avec XML souvent, donc je voudrais vraiment un moyen de script accès à ces données XML via la ligne de commande. Quels sont les meilleurs outils?

140
demandé sur Joseph Holsten 2008-09-18 15:36:58

13 réponses

j'ai trouvé xmlstarlet assez bon à ce genre de chose.

http://xmlstar.sourceforge.net /

devrait également être disponible dans la plupart des dépôts de distribution. Un tutoriel d'introduction est ici:

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

99
répondu Russ 2008-09-18 12:14:07

Certains des outils prometteurs:

  • nokogiri : parsing HTML / XML DOMs in ruby using XPath & CSS selectors

  • hpricot : déprécié

  • fxgrep : Utilise sa propre syntaxe de type XPath pour interroger les documents. Écrit en SML, donc l'installation peut être difficile.

  • LT XML : Boîte à outils XML dérivée des outils SGML, y compris sggrep , sgsort , xmlnorm et autres. Utilise sa propre syntaxe de requête. La documentation est très formel. Écrit en C. LT XML 2 revendications support de XPath, XInclude et d'autres normes du W3C.

  • xmlgrep2 : recherche simple et puissante avec XPath. Écrit en Perl en utilisant XML:: LibXML et libxml2.

  • XQSharp : Supporte XQuery, l'extension de XPath. Rédigé pour le .net Framework.

  • xml-coreutils : La boîte à outils de Laird Breyer équivalente à GNU coreutils. Discuté dans une intéressant essai sur ce que l'idéal boîte à outils devraient 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 publication depuis 2007, et utilise l'automatisation de construction non portable.

xml-coreutils semble le mieux documenté et le plus orienté UNIX.

34
répondu Joseph Holsten 2017-10-06 01:24:44

il y a aussi la paire xml2 et 2xml . Il permettra aux outils habituels d'édition de chaîne de caractères 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
répondu Vi. 2010-06-29 09:31:10

à L'excellente liste de Joseph Holsten, j'ajoute le script en ligne de commande xpath qui est livré avec la bibliothèque XML Perl::XPath. Une excellente façon d'extraire de l'information à partir de fichiers XML:

 xpath -q -e '/entry[@xml:lang="fr"]' *xml
23
répondu bortzmeyer 2009-03-04 08:12:52

vous pouvez utiliser xmllint:

xmllint --xpath //title books.xml

doit être livré avec la plupart des distros, 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
10
répondu Dave Jarvis 2013-04-18 17:52:14

il y a aussi xmlsed & xmlgrep des xmltools NetBSD!

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

6
répondu taggo 2011-05-30 12:20:37

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 donner des paramètres.

5
répondu Adrian Mouat 2008-09-18 20:41:16

si vous cherchez une solution sur Windows, Powershell a intégré des fonctionnalités pour lire et écrire 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

5
répondu Clay 2017-04-13 12:13:47

XQuery pourrait être une bonne solution. Il est (relativement) facile à apprendre et est une norme du W3C.

je recommande XQSharp pour un processeur en ligne de commande.

2
répondu Oliver Hallam 2009-03-03 20:59:32

il y a aussi saxon-lint de 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)' /q/grep-and-sed-equivalent-for-xml-command-line-processing-71603/"x"]' file.xml
2
répondu Gilles Quenot 2015-01-13 03:32:08

JEdit dispose d'un plugin appelé" XQuery " qui fournit des fonctionnalités d'interrogation pour les documents XML.

pas tout à fait la ligne de commande, mais ça marche!

0
répondu Ben 2008-09-18 11:47:15

décider des opérations que vous voulez faire sur les fichiers XML et créer un script (en Python, Perl peut-être) qui expose cette fonctionnalité à travers des arguments pour les scripts shell à utiliser.

0
répondu tzot 2008-09-18 12:12:47

j'ai d'abord utilisé xmlstarlet et toujours de l'utiliser. Lorsque la requête devient difficile, j'ai besoin du support de la fonctionnalité XPATH2 et xquery de XML je me tourne vers xidel http://www.videlibri.de/xidel.html

0
répondu ifelsemonkey 2017-03-16 03:21:13