Frage

Wenn Shell-Skripten zu tun, in der Regel Daten werden wie csv in Dateien von einzelner Zeile Datensätze sein. Es ist wirklich einfach, diese Daten mit grep und sed zu behandeln. Aber ich habe oft mit XML umgehen, also würde ich wirklich wie ein Weg, um Skript Zugriff auf die XML-Daten über die Befehlszeile. Was sind die besten Werkzeuge?

War es hilfreich?

Lösung

Ich habe festgestellt xmlstarlet seine ziemlich gut an dieser Art der Sache.

http://xmlstar.sourceforge.net/

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

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

Andere Tipps

Einige vielversprechende Werkzeuge:

  • nokogiri : Parsen von HTML / XML Dom in Ruby mit XPath und CSS-Selektoren

  • hpricot : veraltet

  • fxgrep : Verfügt über eigene XPath-ähnliche Syntax Dokumente abfragen. Geschrieben in SML, so Installation kann schwierig sein.

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

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

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

  • xml-coreutils : Laird Breyer Toolkit entspricht GNU coreutils. in einem Diskutiert interessant Essay rel="nofollow auf das, was das ideale Toolkit sollte umfassen.

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

  • xmltk : scheint nicht Paket in Debian zu haben, Ubuntu, Fedora, oder Macports, ist seit 2007 Release nicht hatte, und verwendet nicht tragbare Build-Automatisierung.

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

Es gibt auch xml2 und 2xml Paar. Es wird übliche Kettenbearbeitungstools ermöglicht 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.

Um Joseph Holsten ausgezeichnete Liste, füge ich die XPath-Befehlszeilenskript, die mit Perl-Bibliothek XML kommt :: XPath. 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 auch mit Cygwin gebündelt wird.

$ xmllint --version
xmllint: using libxml version 20900

Siehe auch:

$ 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 ist auch xmlsed & xmlgrep der NetBSD xmltools!

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

Wenn Sie sich für eine Lösung auf Windows suchen, hat Powershell integrierte Funktionalität für das 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-Befehlszeilenfenster

Abhängig von genau das, was Sie tun mögen.

XSLT kann der Weg zu gehen, aber es gibt eine Lernkurve. Versuchen Sie xsltproc und beachten Sie, dass Sie die Parameter von Hand in kann.

Es kann auch von der Kommandozeile saxon-lint ist mit der Fähigkeit, XPath zu verwenden 3.0 / XQuery 3.0 . (Andere Kommandozeilen-Tools 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

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

Ich würde empfehlen, XQSharp für eine Befehlszeilenprozessor.

ich zum ersten Mal verwendet xmlstarlet und verwenden es immer noch. Wenn die Abfrage hart auf hart kommt, muss ich XML die xpath2 und xquery Feature Unterstützung, die ich auf drehen xidel http://www.videlibri.de/xidel.html

JEdit hat ein Plugin namens "XQuery", die für XML-Dokumente abfragen Funktionalität bereitstellt.

Nicht ganz Befehlszeile, aber es funktioniert!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top