Pergunta

Ao fazer shell script, normalmente dados estarão em arquivos de registros de linha única como CSV. É realmente simples para lidar com esses dados com grep e sed. Mas eu tenho que lidar com XML, muitas vezes, então eu gostaria realmente uma forma de acesso script para que os dados XML via linha de comando. Quais são as melhores ferramentas?

Foi útil?

Solução

xmlstarlet

que eu encontrei para ser muito bom neste tipo de coisa.

http://xmlstar.sourceforge.net/

Deve estar disponível na maioria dos repositórios da distro, também. Um tutorial introdutório é aqui:

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

Outras dicas

Algumas ferramentas promissoras:

  • nokogiri : análise de HTML / XML DOM em Ruby utilizando XPath e seletores CSS

  • hpricot : deprecated

  • fxgrep : Utiliza o seu próprio XPath-como sintaxe para documentos de consulta. Escrito em SML, assim instalação pode ser difícil.

  • LT XML : kit de ferramentas XML derivada de ferramentas SGML, incluindo sggrep, sgsort, xmlnorm e outros. Utiliza o seu próprio sintaxe de consulta. A documentação é muito formal. Escrito em C. LT XML 2 reivindicações apoiar de XPath, XInclude e normas outra W3C.

  • xmlgrep2 : simples e poderosa pesquisa com o XPath. Escrito em Perl usando XML :: LibXML e libxml2.

  • XQSharp : Suporta XQuery, a extensão de XPath. Escrito para o .NET Framework.

  • xml-coreutils : Laird Breyer kit de ferramentas equivalente a coreutils GNU. Discutido em um interessante ensaio sobre o que o kit de ferramentas ideal deve incluir.

  • xmldiff : ferramenta simples para comparar dois arquivos XML.

  • xmltk : não parece ter pacote no Debian, Ubuntu, Fedora, ou MacPorts, não teve um lançamento desde 2007, e utiliza a automatização de construção não-portáteis.

xml-coreutils parece ser a melhor documentado e mais orientada para UNIX.

Há também xml2 e par 2xml. Ele permitirá seqüência habitual ferramentas de edição de XML processo.

Exemplo. 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. Há também html2 / 2html.

excelente carta de Para Joseph Holsten, eu adicionar o script de linha de comando xpath que vem com Perl biblioteca XML :: XPath. Uma ótima maneira de extrair informações a partir de arquivos XML:

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

Você pode usar xmllint:

xmllint --xpath //title books.xml

Deve ser empacotado com a maioria das distros, e também vem com o Cygwin.

$ xmllint --version
xmllint: using libxml version 20900

Veja:

$ 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

Há também está xmlsed & xmlgrep dos xmltools NetBSD!

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

Se você está procurando uma solução no Windows, PowerShell foi construído com funcionalidade para ler e escrever 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>

Fonte: https://serverfault.com/questions/26976/update -xml-de-the-comando de linha de janelas

Depende exatamente o que você quer fazer.

XSLT pode ser o caminho a percorrer, mas há uma curva de aprendizado. Tente xsltproc e nota que você pode entregar em parâmetros.

Há também saxon-lint de linha de comando com a capacidade de usar XPath 3.0 / XQuery 3.0 . (Outras ferramentas de linha de comando usar XPath 1.0).

EXEMPLOS:

http / html:

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

xml:

$ saxon-lint --xpath '//a[@class="x"]' file.xml

XQuery pode ser uma boa solução. É (relativamente) fácil de aprender e é um padrão W3C.

Eu recomendaria XQSharp para um processador de linha de comando.

A primeira vez que usou xmlstarlet e ainda usá-lo. Quando a consulta fica difícil, eu preciso de XML xpath2 e xquery suporte a recursos dirijo-me a xidel http://www.videlibri.de/xidel.html

JEdit tem um plugin chamado "XQuery", que fornece a funcionalidade de consulta de documentos XML.

Não é bem a linha de comando, mas funciona!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top