examples - Grep y Sed Equivalentes para procesamiento de línea de comando XML
xmlstarlet (13)
¡También hay xmlsed y xmlgrep de NetBSD xmltools!
Al hacer scripts de shell, normalmente los datos estarán en archivos de registros de una sola línea como csv. Es realmente simple manejar estos datos con grep
y sed
. Pero tengo que lidiar con XML a menudo, por lo que realmente me gustaría una forma de script de acceso a los datos XML a través de la línea de comandos. ¿Cuáles son las mejores herramientas?
A la excelente lista de Joseph Holsten, agrego el script de línea de comandos xpath que viene con la biblioteca Perl XML :: XPath. Una excelente forma de extraer información de archivos XML:
xpath -q -e ''/entry[@xml:lang="fr"]'' *xml
Algunas herramientas prometedoras:
nokogiri : análisis de HTML / XML DOM en ruby utilizando los selectores de XPath y CSS
hpricot : obsoleto
fxgrep : utiliza su propia sintaxis similar a XPath para consultar documentos. Escrito en SML, por lo que la instalación puede ser difícil.
LT XML : conjunto de herramientas XML derivado de las herramientas SGML, incluidas
sggrep
,sgsort
,xmlnorm
y otras. Utiliza su propia sintaxis de consulta. La documentación es muy formal. Escrito en C. LT XML 2 afirma el soporte de XPath, XInclude y otros estándares W3C.xmlgrep2 : búsqueda simple y potente con XPath. Escrito en Perl usando XML :: LibXML y libxml2.
XQSharp : admite XQuery, la extensión de XPath. Escrito para .NET Framework.
xml-coreutils : conjunto de herramientas de Laird Breyer equivalente a GNU coreutils. Discutido en un essay interesante sobre lo que debe incluir el juego de herramientas ideal.
xmldiff : herramienta simple para comparar dos archivos xml.
xmltk : no parece tener paquete en debian, ubuntu, fedora o macports, no ha tenido un lanzamiento desde 2007, y usa la automatización de compilación no portátil.
xml-coreutils parece ser el mejor documentado y el más orientado a UNIX.
Decida qué operaciones desea hacer en los archivos XML y cree un script (en Python, tal vez Perl) que exponga esa funcionalidad a través de argumentos para que los scripts de shell los usen.
Depende exactamente de lo que quieras hacer.
XSLT puede ser el camino a seguir, pero hay una curva de aprendizaje. Pruebe xsltproc y tenga en cuenta que puede entregar los parámetros.
He encontrado que xmlstarlet es bastante bueno en este tipo de cosas.
http://xmlstar.sourceforge.net/
Debería estar disponible en la mayoría de los repositorios de distribución, también. Un tutorial introductorio está aquí:
JEdit tiene un complemento llamado "XQuery" que proporciona funciones de consulta para documentos XML.
No es exactamente la línea de comando, ¡pero funciona!
Primero utilicé xmlstarlet y aún lo uso. Cuando la consulta se pone difícil, necesito el soporte de xpath2 y xquery de XML. Me dirijo a xidel http://www.videlibri.de/xidel.html
Puedes usar xmllint:
xmllint --xpath //title books.xml
Debe incluirse con la mayoría de las distribuciones, y también se incluye con Cygwin.
$ xmllint --version
xmllint: using libxml version 20900
Ver:
$ 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
Si está buscando una solución en Windows, Powershell tiene una funcionalidad integrada para leer y escribir XML.
test.xml:
<root>
<one>I like applesauce</one>
<two>You sure bet I do!</two>
</root>
Secuencia de comandos de 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>
Fuente: https://serverfault.com/questions/26976/update-xml-from-the-command-line-windows
También hay 2xml
par de xml2
y 2xml
. Permitirá que las herramientas de edición de cadenas usen XML.
Ejemplo. 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>
PD También hay html2
/ 2html
.
XQuery podría ser una buena solución. Es (relativamente) fácil de aprender y es un estándar W3C.
Recomendaría XQSharp para un procesador de línea de comando.
También hay saxon-lint
desde la línea de comandos con la capacidad de usar XPath 3.0 / XQuery 3.0. (Otras herramientas de línea de comandos usan XPath 1.0).
EJEMPLOS:
http / html:
$ saxon-lint --html --xpath ''count(//a)'' http://.com/q/91791
328
xml:
$ saxon-lint --xpath ''//a[@class="x"]'' file.xml