Эквиваленты Grep и Sed для обработки командной строки XML

StackOverflow https://stackoverflow.com/questions/91791

  •  01-07-2019
  •  | 
  •  

Вопрос

При выполнении сценариев командной строки обычно данные будут находиться в файлах с однострочными записями, таких как csv.Обрабатывать эти данные действительно просто grep и sed.Но мне часто приходится иметь дело с XML, поэтому мне бы очень хотелось найти способ скриптового доступа к этим XML-данным через командную строку.Какие инструменты лучше всего подходят?

Это было полезно?

Решение

Я обнаружил, что xmlstarlet довольно хорош в подобных вещах.

http://xmlstar.sourceforge.net/

Также должен быть доступен в большинстве репозиториев дистрибутивов.Вводный урок находится здесь:

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

Другие советы

Некоторые многообещающие инструменты:

  • нкогири:синтаксический анализ доменов 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!

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

Если вы ищете решение в 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-документам.

Не совсем командная строка, но это работает!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top