Эквиваленты Grep и Sed для обработки командной строки XML
-
01-07-2019 - |
Вопрос
При выполнении сценариев командной строки обычно данные будут находиться в файлах с однострочными записями, таких как csv.Обрабатывать эти данные действительно просто grep
и sed
.Но мне часто приходится иметь дело с XML, поэтому мне бы очень хотелось найти способ скриптового доступа к этим XML-данным через командную строку.Какие инструменты лучше всего подходят?
Решение
Я обнаружил, что xmlstarlet довольно хорош в подобных вещах.
http://xmlstar.sourceforge.net/
Также должен быть доступен в большинстве репозиториев дистрибутивов.Вводный урок находится здесь:
Другие советы
Некоторые многообещающие инструменты:
нкогири:синтаксический анализ доменов HTML / XML в ruby с использованием селекторов XPath и CSS
хприкот:устаревший
fxgrep:Использует свой собственный синтаксис, подобный XPath, для запроса документов.Написан на SML, поэтому установка может быть затруднена.
LT XML:XML toolkit, производный от инструментов SGML, включая
sggrep
,sgsort
,xmlnorm
и другие.Использует свой собственный синтаксис запроса.Документация является очень формальный.Написано на C.LT XML 2 заявляет о поддержке XPath, XInclude и других стандартов W3C.xmlgrep2:простой и мощный поиск с помощью XPath.Написан на Perl с использованием XML::LibXML и libxml2.
XQSharp:Поддерживает XQuery, расширение для XPath.Написан для .NET Framework.
xml-файлы ядра:Инструментарий Лэрда Брейера эквивалентен GNU coreutils.Обсуждалось в интересном эссе о том, что должен включать в себя идеальный инструментарий.
xmldiff:Простой инструмент для сравнения двух XML-файлов.
xmltk:похоже, у него нет пакета в debian, ubuntu, fedora или macports, он не выпускался с 2007 года и использует непереносимую автоматизацию сборки.
xml-coreutils кажется наиболее документированным и наиболее ориентированным на UNIX.
Существует также xml2
и 2xml
пара.Это позволит обычным инструментам редактирования строк обрабатывать XML.
Пример.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.Существуют также html2
/ 2html
.
К превосходному списку Джозефа Холстена я добавляю скрипт командной строки xpath, который поставляется с библиотекой Perl XML::XPath.Отличный способ извлечения информации из XML-файлов:
xpath -q -e '/entry[@xml:lang="fr"]' *xml
Вы можете использовать xmllint:
xmllint --xpath //title books.xml
Должен поставляться в комплекте с большинством дистрибутивов, а также поставляется в комплекте с Cygwin.
$ xmllint --version
xmllint: using libxml version 20900
Видишь:
$ 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
Есть также xmlsed и xmlgrep из NetBSD xmltools!
Если вы ищете решение в Windows, Powershell обладает встроенной функциональностью для чтения и записи XML.
test.xml:
<root>
<one>I like applesauce</one>
<two>You sure bet I do!</two>
</root>
Скрипт 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>
Источник: https://serverfault.com/questions/26976/update-xml-from-the-command-line-windows
Зависит от того, что именно вы хотите сделать.
Возможно, стоит пойти по пути XSLT, но есть кривая обучения.Попробуй xsltproc и обратите внимание, что вы можете указать параметры.
Есть также saxon-lint
из командной строки с возможностью использования XPath 3.0 /XQuery 3.0.(Другие инструменты командной строки используют XPath 1.0).
ПРИМЕРЫ :
http/html:
$ saxon-lint --html --xpath 'count(//a)' http://stackoverflow.com/q/91791
328
xml :
$ saxon-lint --xpath '//a[@class="x"]' file.xml
XQuery может быть хорошим решением.Он (относительно) прост в освоении и является стандартом W3C.
Я бы порекомендовал XQSharp для процессора командной строки.
Я впервые использовал xmlstarlet ( звездочка) и все еще пользуюсь им.Когда запрос становится сложным, мне нужны XML-файлы xpath2 и xquery - запрос поддержка функций, к которым я обращаюсь ксидель http://www.videlibri.de/xidel.html
В jEdit есть плагин под названием "XQuery", который предоставляет функциональность запросов к XML-документам.
Не совсем командная строка, но это работает!