用于XML命令行处理的Grep和Sed等效
在执行shell脚本时,通常数据将在单行logging(如csv)的文件中。 用grep
和sed
处理这个数据真的很简单。 但是我必须经常处理XML,所以我真的很喜欢通过命令行脚本访问XML数据的方法。 什么是最好的工具?
一些有前景的工具
-
nokogiri :使用XPath和CSSselect器在Ruby中parsingHTML / XML DOM
-
hpricot :已弃用
-
fxgrep :使用自己的类XPath语法来查询文档。 用SML编写,所以安装可能很困难。
-
LT XML :从SGML工具派生的XML工具包,包括
sggrep
,sgsort
,xmlnorm
等。 使用自己的查询语法。 文件是非常正式的。 用C语言编写。LT XML 2声称支持XPath,XInclude和其他W3C标准。 -
xmlgrep2 :使用XPath进行简单而强大的search。 用Perl ::使用XML :: LibXML和libxml2编写。
-
XQSharp :支持XQuery,即XPath的扩展。 编写的.NET框架。
-
xml-coreutils :相当于GNU coreutils的Laird Breyer的工具包。 在一篇有趣的文章中讨论理想的工具包应该包括什么。
-
xmldiff :用于比较两个xml文件的简单工具。
-
xmltk :似乎没有在debian,ubuntu,fedora或macports中打包,自2007年以来还没有发布,并使用非可移植的构build自动化。
xml-coreutils似乎是最好的文档和大多数面向UNIX的。
还有xml2
和2xml
对。 它将允许通常的string编辑工具来处理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>
PS还有html2
/ 2html
。
对Joseph Holsten的优秀列表,我添加了Perl库XML :: XPath附带的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
取决于你想要做什么。
XSLT可能是要走的路,但是有一条学习曲线。 尝试xsltproc,并注意你可以提交参数。
还有NetBSD xmltools的xmlgre和xmlgrep!
如果您在Windows上寻找解决scheme,Powershell具有读取和写入XML的内置function。
的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
XQuery可能是一个很好的解决scheme。 这是(相对)容易学习,是一个W3C标准。
我会推荐一个命令行处理器的XQSharp 。
还有命令行中的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
JEdit有一个名为“XQuery”的插件,它为XML文档提供查询function。
不是命令行,但它的工作原理!
决定你想要在XML文件上做什么操作,并创build一个脚本(可能是Python,Perl),通过shell脚本的参数公开这个function。
我第一次使用xmlstarlet ,仍然使用它。 当查询变得困难时,我需要XML的xpath2和xquery特性支持我转向xidel http://www.videlibri.de/xidel.html