it-swarm.com.de

Grep und Sed Entspricht der XML-Befehlszeilenverarbeitung

Bei der Ausführung von Shell-Skripten befinden sich die Daten normalerweise in Dateien mit einzeiligen Datensätzen wie csv. Es ist wirklich einfach, diese Daten mit grep und sed zu verarbeiten. Aber ich muss mich oft mit XML auseinandersetzen, also möchte ich wirklich einen Weg finden, über die Befehlszeile auf diese XML-Daten zuzugreifen. Was sind die besten Werkzeuge?

144
Joseph Holsten

Ich habe festgestellt, dass xmlstarlet in so etwas ziemlich gut ist.

http://xmlstar.sourceforge.net/

Sollte auch in den meisten Distributionsspeichern verfügbar sein. Ein einführendes Tutorial finden Sie hier:

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

101
Russ

Einige vielversprechende Tools:

  • nokogiri : Analysieren von HTML/XML-DOMs in Ruby mit XPath- und CSS-Selektoren

  • hpricot : veraltet

  • fxgrep : Verwendet eine eigene XPath-ähnliche Syntax zum Abfragen 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. In C. LT XML 2 beansprucht die Unterstützung von XPath, XInclude und anderen W3C-Standards.

  • xmlgrep2 : Einfache und leistungsstarke Suche mit XPath. Geschrieben in Perl mit XML :: LibXML und libxml2.

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

  • xml-coreutils : Laird Breyers Toolkit entspricht GNU coreutils. Besprochen in einem interessanten Essay , was das ideale Toolkit enthalten sollte.

  • xmldiff : Einfaches Tool zum Vergleichen von zwei XML-Dateien.

  • xmltk : Scheint kein Paket in debian, ubuntu, Fedora oder macports zu haben, hat seit 2007 keine Veröffentlichung mehr und verwendet nicht-portable Build-Automatisierung.

xml-coreutils scheint das am besten dokumentierte und am meisten UNIX-orientierte zu sein.

34
Joseph Holsten

Es gibt auch xml2 und 2xml Paar. Es ermöglicht den üblichen Werkzeugen zur Bearbeitung von Strings, XML zu verarbeiten.

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

24
Vi.

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

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

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

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

test.xml:

<root>
  <one>I like applesauce</one>
  <two>You sure bet I do!</two>
</root>

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

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

7
Clay

Es gibt auch xmlsed & xmlgrep der NetBSD xmltools!

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

7
taggo

Kommt genau darauf an, was du machen willst.

XSLT ist vielleicht der richtige Weg, aber es gibt eine Lernkurve. Versuchen Sie xsltproc und beachten Sie, dass Sie Parameter eingeben können.

5
Adrian Mouat

Es gibt auch saxon-lint über die Befehlszeile 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
3
Gilles Quenot

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

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

2
Oliver Hallam

Ich habe zuerst xmlstarlet verwendet und benutze es immer noch. Wenn die Abfrage schwierig wird, benötige ich XMLs xpath2 und xquery Funktionsunterstützung, an die ich mich wende xidel - http://www.videlibri.de/xidel.html

1
typelogic