Grep und Sed Equivalent für XML-Befehlszeilenverarbeitung

Beim Shell-Scripting befinden sich die Daten normalerweise in Einzeldatensätzen wie csv. Es ist wirklich einfach, diese Daten mit grep und sed . Aber ich muss mich oft mit XML beschäftigen, also würde ich gerne einen Weg finden, um den Zugriff auf diese XML-Daten über die Befehlszeile zu skripten. Was sind die besten Werkzeuge?

Ich habe festgestellt, dass xmlstarlet ziemlich gut in dieser Sache ist.

http://xmlstar.sourceforge.net/

Sollte auch in den meisten Distributions-Repositories verfügbar sein. Ein einführendes Tutorial ist hier:

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

Einige vielversprechende Werkzeuge:

  • nokogiri : Analyse von HTML / XML DOMs in Ruby mit XPath & CSS Selektoren

  • hpricot : veraltet

  • fxgrep : Verwendet seine eigene XPath-ähnliche Syntax zur Abfrage von Dokumenten. Geschrieben in SML, daher kann die Installation schwierig sein.

  • LT XML : XML-Toolkit, abgeleitet von SGML-Tools, einschließlich sggrep , sgsort , xmlnorm und anderen. Verwendet eine eigene Abfragesyntax. Die Dokumentation ist sehr formal. Geschrieben in C. LT XML 2 beansprucht die Unterstützung von XPath, XInclude und anderen W3C-Standards.

  • xmlgrep2 : Einfache und leistungsstarke Suche mit XPath. In Perl geschrieben mit XML :: LibXML und libxml2.

  • XQSharp : Unterstützt XQuery, die Erweiterung zu XPath. Für das .NET Framework geschrieben.

  • xml-coreutils : Laird Breyers Toolkit entspricht GNU Coreutils. Diskutiert in einem interessanten Aufsatz darüber, was das ideale Toolkit beinhalten sollte.

  • xmldiff : Einfaches Tool zum Vergleichen zweier XML-Dateien.

  • xmltk : scheint kein Paket in debian, ubuntu, fedora oder macports zu haben, hatte seit 2007 keine Veröffentlichung und verwendet nicht-portable Build-Automatisierung.

xml-coreutils scheint am besten dokumentiert und am meisten UNIX-orientiert.

Es gibt auch xml2 und 2xml Paar. Es ermöglicht den üblichen String-Editierwerkzeugen, XML zu verarbeiten.

Beispiel. 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 Es gibt auch html2 / 2html .

Zu Joseph Holstens ausgezeichneter Liste füge ich das xpath-Befehlszeilenskript hinzu, das mit der Perl-Bibliothek XML :: XPath geliefert wird. Eine gute Möglichkeit, Informationen aus XML-Dateien zu extrahieren:

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

Sie können xmllint verwenden:

 xmllint --xpath //title books.xml 

Sollte mit den meisten Distributionen gebündelt werden und wird auch mit Cygwin gebündelt.

 $ xmllint --version xmllint: using libxml version 20900 

Sehen:

 $ 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 

Es gibt auch xmlsed & xmlgrep von NetBSD xmltools!

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

Hängt davon ab, was genau du machen willst.

XSLT ist vielleicht der Weg zu gehen, aber es gibt eine Lernkurve. Versuchen Sie xsltproc und beachten Sie, dass Sie Parameter übergeben können.

Wenn Sie nach einer Lösung für Windows suchen, verfügt Powershell über integrierte functionen zum Lesen und Schreiben von XML.

test.xml:

  I like applesauce You sure bet I do!  

Powershell-Skript:

 # 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!  

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

XQuery könnte eine gute Lösung sein. Es ist (relativ) einfach zu erlernen und ist ein W3C-Standard.

Ich würde XQSharp für einen Befehlszeilenprozessor empfehlen.

Es gibt auch saxon-lint von der Kommandozeile mit der Fähigkeit, XPath 3.0 / XQuery 3.0 zu verwenden. (Andere Befehlszeilentools verwenden XPath 1.0).

Beispiele:

http / html:

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

xml:

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

JEdit hat ein Plugin namens “XQuery”, das Abfragefunktionen für XML-Dokumente bietet.

Nicht ganz die Befehlszeile, aber es funktioniert!

Entscheiden Sie, welche Operationen Sie für XML-Dateien ausführen möchten, und erstellen Sie ein Skript (in Python, vielleicht Perl), das diese functionalität durch Argumente für zu verwendende Shellskripte verfügbar macht.

Ich benutzte zuerst xmlstarlet und benutze es immer noch. Wenn die Abfrage schwierig wird, brauche ich XML Xpath2 und Xquery Feature-Unterstützung Ich wende mich an xidel http://www.videlibri.de/xidel.html