Equivalente Grep e Sed per l’elaborazione della riga di comando XML

Quando si esegue lo scripting di shell, in genere i dati si troveranno in file di record a riga singola come csv. È davvero semplice gestire questi dati con grep e sed . Ma ho spesso a che fare con XML, quindi mi piacerebbe davvero un modo per accedere agli script di tali dati XML tramite la riga di comando. Quali sono gli strumenti migliori?

Ho trovato xmlstarlet per essere abbastanza bravo in questo genere di cose.

http://xmlstar.sourceforge.net/

Dovrebbe essere disponibile anche nella maggior parte dei repository di distribuzione. Un tutorial introduttivo è qui:

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

Alcuni strumenti promettenti:

  • nokogiri : parsing di DOM HTML / XML in ruby ​​usando i selettori XPath e CSS

  • hpricot : deprecato

  • fxgrep : utilizza la propria syntax XPath per interrogare i documenti. Scritto in SML, quindi l’installazione potrebbe essere difficile.

  • LT XML : toolkit XML derivato da strumenti SGML, inclusi sggrep , sgsort , xmlnorm e altri. Utilizza la propria syntax della query. La documentazione è molto formale. Scritto in C. LT XML 2 sostiene il supporto di XPath, XInclude e altri standard W3C.

  • xmlgrep2 : ricerca semplice e potente con XPath. Scritto in Perl usando XML :: LibXML e libxml2.

  • XQSharp : supporta XQuery, l’estensione a XPath. Scritto per .NET Framework.

  • xml-coreutils : toolkit di Laird Breyer equivalente a coreutils GNU. Discusso in un interessante saggio su ciò che dovrebbe includere il toolkit ideale.

  • xmldiff : semplice strumento per confrontare due file xml.

  • xmltk : non sembra avere un pacchetto in debian, ubuntu, fedora, o macports, non ha avuto un rilascio dal 2007 e utilizza l’automazione di build non portatile.

xml-coreutils sembra il meglio documentato e più orientato verso UNIX.

C’è anche 2xml coppia xml2 e 2xml . Consentirà ai soliti strumenti di modifica delle stringhe di elaborare XML.

Esempio. q.xml:

 < ?xml version="1.0"?>  text more text ddddsss < ![CDATA[ asfdasdsa  sdfsdfdsf  ]]>  

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  sdfsdfdsf  /foo= 

xml2 < q.xml | grep textnode | sed 's!/foo!/bar/baz!' | 2xml

 ddddsss 

PS Ci sono anche html2 / 2html .

Alla lista eccellente di Joseph Holsten, aggiungo lo script da riga di comando xpath che viene fornito con la libreria Perl XML :: XPath. Un ottimo modo per estrarre informazioni da file XML:

  xpath -q -e '/entry[@xml:lang="fr"]' *xml 

Puoi usare xmllint:

 xmllint --xpath //title books.xml 

Dovrebbe essere fornito in bundle con la maggior parte delle distro e anche in bundle con Cygwin.

 $ xmllint --version xmllint: using libxml version 20900 

Vedere:

 $ 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 

Ci sono anche xmlsed e xmlgrep di xmltools di NetBSD!

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

Dipende esattamente da ciò che si vuole fare.

XSLT può essere la strada da percorrere, ma c’è una curva di apprendimento. Prova xsltproc e nota che puoi inserire i parametri.

Se stai cercando una soluzione su Windows, Powershell ha funzionalità integrate per leggere e scrivere XML.

test.xml:

  I like applesauce You sure bet I do!  

Script di 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  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:

  Who likes applesauce? You sure bet I do! And don't you forget it!  

Fonte: https://serverfault.com/questions/26976/update-xml-from-the-command-line-windows

XQuery potrebbe essere una buona soluzione. È (relativamente) facile da imparare ed è uno standard W3C.

Consiglierei XQSharp per un processore da riga di comando.

C’è anche saxon-lint dalla linea di comando con la possibilità di usare XPath 3.0 / XQuery 3.0. (Altri strumenti da riga di comando utilizzano XPath 1.0).

ESEMPI

http / html:

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

xml:

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

JEdit ha un plugin chiamato “XQuery” che fornisce funzionalità di interrogazione per i documenti XML.

Non proprio la linea di comando, ma funziona!

Decidi quali operazioni vuoi eseguire sui file XML e crea uno script (in Python, forse Perl) che espone tale funzionalità attraverso argomenti per gli script di shell da utilizzare.

Ho usato per la prima volta xmlstarlet e lo sto ancora usando. Quando la query diventa difficile, ho bisogno del supporto per le xpath2 e xquery di XML. Mi rivolgo a xidel http://www.videlibri.de/xidel.html