it-swarm-id.com

Grep dan Sed Setara dengan Pemrosesan Baris Perintah XML

Saat melakukan skrip Shell, biasanya data akan berada dalam file catatan baris tunggal seperti csv. Sangat mudah untuk menangani data ini dengan grep dan sed. Tapi saya harus sering berurusan dengan XML, jadi saya benar-benar ingin cara akses skrip ke data XML melalui baris perintah. Apa alat terbaik?

144
Joseph Holsten

Saya telah menemukan xmlstarlet cukup bagus dalam hal semacam ini.

http://xmlstar.sourceforge.net/

Harus tersedia di sebagian besar repositori distro juga. Tutorial pengantar ada di sini:

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

101
Russ

Beberapa alat yang menjanjikan:

  • nokogiri : parsing DOM HTML/XML dalam Ruby menggunakan pemilih XPath & CSS

  • hpricot : usang

  • fxgrep : Menggunakan sintaks mirip XPath-nya sendiri untuk permintaan dokumen. Ditulis dalam SML, jadi penginstalan mungkin sulit.

  • LT XML : XML toolkit yang berasal dari alat SGML, termasuk sggrep, sgsort, xmlnorm dan lainnya. Menggunakan sintaks kueri sendiri. Dokumentasi ini sangat formal. Ditulis dalam C. LT XML 2 mengklaim dukungan XPath, XInclude dan standar W3C lainnya.

  • xmlgrep2 : pencarian sederhana dan kuat dengan XPath. Ditulis dalam Perl menggunakan XML :: LibXML dan libxml2.

  • XQSharp : Mendukung XQuery, ekstensi ke XPath. Ditulis untuk .NET Framework.

  • xml-coreutils : Toolkit Laird Breyer setara dengan GNU coreutils. Dibahas secara menarik esai tentang apa yang harus disertakan oleh toolkit ideal.

  • xmldiff : Alat sederhana untuk membandingkan dua file xml.

  • xmltk : sepertinya tidak memiliki paket di debian, ubuntu, Fedora, atau macports, belum memiliki rilis sejak 2007, dan menggunakan otomatisasi pembuatan non-portabel.

xml-coreutils tampaknya yang paling terdokumentasi dan paling berorientasi UNIX.

34
Joseph Holsten

Ada juga xml2 dan 2xml pasangan. Ini akan memungkinkan alat pengeditan string biasa untuk memproses XML.

Contoh. 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. Ada juga html2/2html.

24
Vi.

Ke daftar Joseph Holsten yang sangat baik, saya menambahkan skrip baris perintah xpath yang datang dengan perpustakaan Perl XML :: XPath. Cara hebat untuk mengekstrak informasi dari file XML:

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

Anda dapat menggunakan xmllint:

xmllint --xpath //title books.xml

Harus dibundel dengan sebagian besar distro, dan juga dibundel dengan Cygwin.

$ xmllint --version
xmllint: using libxml version 20900

Lihat:

$ 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

Jika Anda mencari solusi pada Windows, Powershell memiliki fungsionalitas bawaan untuk membaca dan menulis 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>

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

7
Clay

Ada juga xmlsed & xmlgrep dari xmltools NetBSD!

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

7
taggo

Tergantung pada apa yang ingin Anda lakukan.

XSLT mungkin cara yang harus dilakukan, tetapi ada kurva belajar. Coba xsltproc dan perhatikan bahwa Anda dapat memberikan parameter.

5
Adrian Mouat

Ada juga saxon-lint dari baris perintah dengan kemampuan untuk menggunakan XPath 3.0/XQuery 3.0. (Alat baris perintah lainnya menggunakan XPath 1.0).

CONTOH:

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 mungkin solusi yang bagus. Ini (relatif) mudah dipelajari dan merupakan standar W3C.

Saya akan merekomendasikan XQSharp untuk prosesor baris perintah.

2
Oliver Hallam

Saya pertama kali menggunakan xmlstarlet dan masih menggunakannya. Ketika kueri menjadi sulit, saya perlu XML's xpath2 dan xquery dukungan fitur saya beralih ke xidel http://www.videlibri.de/xidel.html

1
typelogic