it-swarm-eu.dev

Grep e Sed equivalente per l'elaborazione della riga di comando XML

Quando si esegue lo scripting Shell, in genere i dati si trovano in file di record a riga singola come CSV. È davvero semplice gestire questi dati con grep e sed. Ma devo occuparmi spesso di XML, quindi mi piacerebbe davvero un modo per accedere agli script di quei dati XML tramite la riga di comando. Quali sono gli strumenti migliori?

144
Joseph Holsten

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 distro. Un tutorial introduttivo è qui:

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

101
Russ

Alcuni strumenti promettenti:

  • nokogiri : analisi dei DOM HTML/XML in Ruby utilizzando i selettori XPath e CSS

  • hpricot : obsoleto

  • fxgrep : utilizza la propria sintassi simile a 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 sintassi della query. La documentazione è molto formale. Scritto in C. LT XML 2 rivendica 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 di XPath. Scritto per .NET Framework.

  • xml-coreutils : Toolkit di Laird Breyer equivalente a GNU coreutils. Discusso in un interessante saggio su cosa 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 è stato rilasciato dal 2007 e usa un'automazione di build non portatile.

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

34
Joseph Holsten

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

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

Post scriptum Ci sono anche html2/2html.

24
Vi.

All'eccellente elenco di Joseph Holsten, aggiungo lo script da riga di comando xpath fornito con la libreria Perl XML :: XPath. Un ottimo modo per estrarre informazioni dai file XML:

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

Puoi usare xmllint:

xmllint --xpath //title books.xml

Dovrebbe essere in bundle con la maggior parte delle distro, ed è 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
12
Dave Jarvis

Se stai cercando una soluzione su Windows, Powershell ha funzionalità integrate per la lettura e la scrittura di 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>

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

7
Clay

Ci sono anche xmlsed e xmlgrep degli xmltools di NetBSD!

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

7
taggo

Dipende esattamente da cosa vuoi fare.

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

5
Adrian Mouat

C'è anche saxon-lint dalla riga di comando con la possibilità di utilizzare 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
3
Gilles Quenot

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

Consiglierei XQSharp per un processore da riga di comando.

2
Oliver Hallam

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

1
typelogic