Odpowiedniki Grep i Sed do przetwarzania wiersza poleceń XML

Podczas wykonywania skryptów powłoki, zazwyczaj Dane będą w plikach pojedynczych rekordów, takich jak csv. Obsługa tych danych jest bardzo prosta za pomocą grep i sed. Ale mam do czynienia z XML często, więc naprawdę chciałbym sposób skrypt dostępu do danych XML za pomocą wiersza poleceń. Jakie są najlepsze narzędzia?

Author: Joseph Holsten, 2008-09-18

13 answers

Uważam, że xmlstarlet jest całkiem dobry w tego typu sprawach.

Http://xmlstar.sourceforge.net/

Powinny być również dostępne w większości repozytoriów distro. Tutorial wprowadzający znajduje się tutaj:

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

 99
Author: Russ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 12:14:07

Niektóre obiecujące narzędzia:

  • Nokogiri : parsowanie domów HTML / XML w ruby przy użyciu selektorów XPath & CSS

  • Hpricot: deprecated

  • Fxgrep : Używa własnej składni podobnej do XPath do odpytywania dokumentów. Napisane w SML, więc instalacja może być trudna.

  • LT XML : XML toolkit wywodzący się z narzędzi SGML, w tym sggrep, sgsort, I inni Używa własnej składni zapytań. Dokumentacja jest Bardzo formalne. Napisany w C. LT XML 2 twierdzi, że obsługuje XPath, XInclude i inne standardy W3C.

  • Xmlgrep2 : proste i wydajne wyszukiwanie za pomocą XPath. Napisane w Perlu za pomocą XML:: LibXML i libxml2.

  • XQSharp : Obsługuje XQuery, rozszerzenie do XPath. Napisany dla. NET Framework.

  • Xml-coreutils : Zestaw narzędzi Lairda Breyera, odpowiednik GNU coreutils. Omówione w ciekawe esej o tym, co powinien zawierać idealny zestaw narzędzi.

  • Xmldiff : Proste narzędzie do porównywania dwóch plików xml.

  • Xmltk: wydaje się, że nie ma pakietu w Debianie, ubuntu, Fedorze lub macports, nie ma Wydania od 2007 roku i używa niestandardowej automatyzacji budowania.

XML-coreutils wydaje się najlepiej udokumentowanym i najbardziej zorientowanym na Uniksa.

 34
Author: Joseph Holsten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-06 01:24:44

Istnieje również xml2 i 2xml para. Pozwoli to zwykłym narzędziom do edycji łańcuchów przetwarzać XML.

Przykład. 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. są też html2 / 2html.

 24
Author: Vi.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-29 09:31:10

Do doskonałej listy Josepha Holstena dodaję skrypt wiersza poleceń xpath, który jest dostarczany z biblioteką Perla XML:: XPath. Świetny sposób na wyodrębnienie informacji z plików XML:

 xpath -q -e '/entry[@xml:lang="fr"]' *xml
 23
Author: bortzmeyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-04 08:12:52

Możesz użyć xmllint:

xmllint --xpath //title books.xml

Powinien być dołączony do większości dystrybucji, a także do Cygwina.

$ xmllint --version
xmllint: using libxml version 20900

Zobacz:

$ 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
 10
Author: Dave Jarvis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-18 17:52:14

Istnieje również xmlsed & xmlgrep z NetBSD xmltools!

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

 6
Author: taggo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-30 12:20:37

Zależy od tego, co dokładnie chcesz zrobić.

XSLT może być drogą do zrobienia, ale jest krzywa uczenia się. Spróbuj xsltproc i zauważ, że możesz podać parametry.

 5
Author: Adrian Mouat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 20:41:16

Jeśli szukasz rozwiązania dla Windows, Powershell ma wbudowaną funkcjonalność do odczytu i zapisu XML.

Test.xml:

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

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

Źródło: https://serverfault.com/questions/26976/update-xml-from-the-command-line-windows

 5
Author: Clay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:13:47

XQuery może być dobrym rozwiązaniem. Jest (stosunkowo) łatwy do nauczenia i jest standardem W3C.

Polecam XQSharp dla procesora linii poleceń.

 2
Author: Oliver Hallam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-03 20:59:32

Istnieje również saxon-lint z linii poleceń z możliwością użycia XPath 3.0/XQuery 3.0. (Inne narzędzia wiersza poleceń używają XPath 1.0).

Przykłady:

Http / html:

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

Xml:

$ saxon-lint --xpath '//a[@class="x"]' file.xml
 2
Author: Gilles Quenot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-13 03:32:08

JEdit posiada wtyczkę o nazwie "XQuery", która zapewnia funkcjonalność zapytań dla dokumentów XML.

Nie do końca wiersza poleceń, ale to działa!

 0
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 11:47:15

Zdecyduj, jakie operacje chcesz wykonać na plikach XML i Utwórz skrypt (w Pythonie, perlu), który ujawnia tę funkcjonalność poprzez argumenty do użycia skryptów powłoki.

 0
Author: tzot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 12:12:47

Pierwszy raz użyłem xmlstarlet i nadal go używam. Gdy zapytanie staje się trudne, potrzebuję obsługi funkcji XML xpath2 i XQuery zamieniam na xidel http://www.videlibri.de/xidel.html

 0
Author: ifelsemonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 03:21:13