xmlstarlet

XMLStarlet是可以在UNIX®,MacOS®X或Microsoft®Windows®命令行上使用的开源XML工具包。 您可以使用XMLStarlet来验证XML,对其进行格式化,选择其部分,使用XSLT进行转换,甚至进行编辑。 这意味着您可以将XML实用程序放入您的Shell脚本中,而无需使用诸如Perl或Java®之类的编程语言编写任何自定义代码。

要开始使用XMLStarlet,您需要先安装它。 但是要这样做,您需要libxml2和libxslt2库。 在Windows上,您不需要安装libxml2和libxslt2 -它们是Win32软件包附带的。 您可以下载Win32可执行文件并将其安装在路径中的某个位置,以便可以从命令行轻松地执行该文件。 如果你正在运行UNIX,和你的机器还没有libxml2和libxslt2,那么你必须下载并安装它们(参见相关主题 )。

接下来,浏览到XMLStarlet主页,并下载最新版本(请参阅参考资料 )。 运行./configure脚本以设置构建脚本。 然后,运行make install生成软件包并安装。 如果您不是超级用户,则应使用sudo make install以便将命令安装在系统目录中。

您可能还想查看XML,XSLT和XML路径语言(XPath)页面,以符合这三个标准。 他们以充分利用XMLStarlet的关键(见相关主题 )。

基础

现在已经安装了,您可以浏览XMLStarlet。 首先xml运行xml命令(请参见清单1)。

清单1. XMLStarlet帮助页面
% xml
XMLStarlet Toolkit: command-line utilities for XML
Usage: xml [<options>] <command> [<cmd-options>]
where <command> is one of:
ed    (or edit)      - Edit/Update XML document(s)
sel   (or select)    - Select data or query XML document(s) (XPATH, etc)
tr    (or transform) - Transform XML document(s) using XSLT
val   (or validate)  - Validate XML document(s) (well-formed/DTD/XSD/RelaxNG)
fo    (or format)    - Format XML document(s)
el    (or elements)  - Display element structure of XML document
c14n  (or canonic)   - XML canonicalization
ls    (or list)      - List directory as XML
esc   (or escape)    - Escape special XML characters
unesc (or unescape)  - Unescape special XML characters
pyx   (or xmln)      - Convert XML into PYX format (based on ESIS - ISO 8879)
p2x   (or depyx)     - Convert PYX into XML
<options> are:
--version            - show version
--help  - show help
Wherever file name mentioned in command help it is assumed
that URL can be used instead as well.Type: xml <command> --help <ENTER> for command helpXMLStarlet is a command line toolkit to query/edit/check/transform
XML documents (for more information see http://xmlstar.sourceforge.net/)

每个命令的基本格式为xml <command>后接一些选项。 获得每个选项的帮助就像xml <command> --help一样容易。 例如,清单2显示了edit( ed )命令的帮助。

清单2. edit命令的帮助
% xml ed --help
XMLStarlet Toolkit: Edit XML document(s)
Usage: xml ed <global-options> {<action>} [ <xml-file-or-uri> ... ]
where
<global-options>  - global options for editing
<xml-file-or-uri> - input XML document file name/uri (stdin otherwise)<global-options> are:
-P (or --pf)        - preserve original formatting
-S (or --ps)        - preserve non-significant spaces
-O (or --omit-decl) - omit XML declaration (<?xml ...?>)
-N <name>=<value>   - predefine namespaces (name without 'xmlns:')
ex: xsql=urn:oracle-xsql
Multiple -N options are allowed.
-N options must be last global options.
--help or -h        - display helpwhere <action>
-d or --delete <xpath>
-i or --insert <xpath> -t (--type) elem|text|attr -n <name> -v (--value) <value>
-a or --append <xpath> -t (--type) elem|text|attr -n <name> -v (--value) <value>
-s or --subnode <xpath> -t (--type) elem|text|attr -n <name> -v (--value) <value>
-m or --move <xpath1> <xpath2>
-r or --rename <xpath1> -v <new-name>
-u or --update <xpath> -v (--value) <value>
-x (--expr) <xpath> (-x is not implemented yet)XMLStarlet is a command line toolkit to query/edit/check/transform
XML documents (for more information see http://xmlstar.sourceforge.net/)

这种帮助显示看起来很复杂,但是好的东西在底部; 在这里,您将了解有关删除XML节点,插入它们,更改其值等的知识。

XML目录清单

长代码行

本文中的某些代码行太长,无法放入窗口中而不会被截断。 这些行包装在代码清单中,尽管它们出现在实际命令行的一行中。 这些行用»符号表示(例如,参见清单3)。

要开始使用XMLStarlet,您需要XML。 这使您进入第一个命令xml ls ,该命令给出了XML当前目录的列表。 清单3显示了一个示例。

清单3. XML目录清单
% xml ls
<xml><d p="rwxr-xr-x" a="2005.05.04 23:03:46" » m="2004.03.24 16:21:02" s="374" n="."/><d p="rwxr-xr-x" a="2005.05.04 23:03:46" » m="2005.05.04 22:13:41" s="1938"n=".."/><f p="rw-r--r--" a="2005.03.24 17:53:52" » m="2004.03.24 01:13:43" s="6148"n=".DS_Store"/><f p="rw-r--r--" a="2005.03.24 17:53:52" » m="2004.03.24 00:41:46" s="173" n="build.xml"/><d p="rwxr-xr-x" a="2005.04.30 11:34:27" » m="2004.03.24 01:13:43" s="544" n="docs"/><f p="rw-r--r--" a="2005.03.24 17:53:52" » m="2004.03.21 18:41:58" s="641" n="input.xml"/><f p="rw-r--r--" a="2005.03.24 17:53:52" » m="2004.03.23 23:41:15" s="3587"n="main.xsl"/><f p="rw-r--r--" a="2005.03.24 17:53:52" » m="2004.03.24 00:37:10" s="184" n="Makefile"/><f p="rw-r--r--" a="2005.03.24 17:53:52" » m="2004.03.24 00:36:41" s="3869"n="MyGenerator.class"/><f p="rw-r--r--" a="2005.03.24 17:53:52" » m="2004.03.24 00:36:33" s="5265"n="MyGenerator.java"/><d p="rwxr-xr-x" a="2005.04.30 11:34:25" » m="2004.03.24 00:20:07" s="272" n="output"/>
</xml>

您可能会认为此目录列表显示了太多信息。 如果是这样,您可以(例如)删除目录节点,如清单4所示。

清单4.没有目录节点的目录清单
% xml ls | xml ed -d "//d"
<?xml version="1.0"?>
<xml><f p="rw-r--r--" a="2005.03.24 17:53:52" » m="2004.03.24 01:13:43" s="6148" n=".DS_Store"/><f p="rw-r--r--" a="2005.03.24 17:53:52" » m="2004.03.24 00:41:46" s="173" n="build.xml"/><f p="rw-r--r--" a="2005.03.24 17:53:52" » m="2004.03.21 18:41:58" s="641" n="input.xml"/><f p="rw-r--r--" a="2005.03.24 17:53:52" » m="2004.03.23 23:41:15" s="3587" n="main.xsl"/><f p="rw-r--r--" a="2005.03.24 17:53:52" » m="2004.03.24 00:37:10" s="184" n="Makefile"/><f p="rw-r--r--" a="2005.03.24 17:53:52" » m="2004.03.24 00:36:41" s="3869" n="MyGenerator.class"/><f p="rw-r--r--" a="2005.03.24 17:53:52" » m="2004.03.24 00:36:33" s="5265" n="MyGenerator.java"/>
</xml>

您使用edit命令( ed )从XML中删除d节点。 ls命令将目录输出到标准输出。 然后,管道( | )将标准输出重定向到edit命令的标准输入,这将从列表中删除d节点。 您可以使用XPath表达式//d指定d节点,该表达式与树中任何级别的d节点匹配。 您可以使用/xml/d使此命令更具体。

现在,假设您要删除am属性(请参见清单5)。

清单5.没有a和m属性的目录清单
% xml ls | xml ed -d "//d" -d "//@a" -d "//@m" -d "//@p"
<?xml version="1.0"?>
<xml><f s="6148" n=".DS_Store"/><f s="173" n="build.xml"/><f s="641" n="input.xml"/><f s="3587" n="main.xsl"/><f s="184" n="Makefile"/><f s="3869" n="MyGenerator.class"/><f s="5265" n="MyGenerator.java"/>
</xml>

那更可行。 您的清单仅限于文件,在文件节点中,您只能看到文件的大小和名称。 为了使显示更容易理解,可以将结果放入一个名为ls.xml的文件中。 您还可以使用rename编辑功能将f标记更改为file (请参见清单6)。

清单6.具有大小和名称属性的目录清单
% cat ls.xml | xml ed -r "//f" -v "file"
<?xml version="1.0"?>
<xml><file s="6148" n=".DS_Store"/><file s="173" n="build.xml"/><file s="641" n="input.xml"/><file s="3587" n="main.xsl"/><file s="184" n="Makefile"/><file s="3869" n="MyGenerator.class"/><file s="5265" n="MyGenerator.java"/>
</xml>

另外,除了将短名称用于sns标记和属性之外,还可以将它们分别更改为sizename (请参见清单7)。

清单7.带有文件标签的目录清单
% cat ls.xml | xml ed -r "//f" -v "file" -r "//@s" -v "size" -r "//@n" -v "name"
<?xml version="1.0"?>
<xml><file size="6148" name=".DS_Store"/><file size="173" name="build.xml"/><file size="641" name="input.xml"/><file size="3587" name="main.xsl"/><file size="184" name="Makefile"/><file size="3869" name="MyGenerator.class"/><file size="5265" name="MyGenerator.java"/>
</xml>

这很容易阅读。 而且您还没有编写一行XSLT,Perl或Java代码。 将此文件另存为ls2.xml。

证实

新的目录清单很好,但是仍然有效吗? 清单8显示了如何确定这一点。

清单8.检查XML的格式正确性
% xml val ls2.xml
ls2.xml - valid

是的,这是有效的。 从某种意义上说,它是格式正确的-这意味着标签是平衡的,字符已正确编码,并且是类似的东西。 但是它可能仍然没有所有必需的标签或正确的标签。 要确定这一点,您需要知道文件的正确结构。 因此,您需要一个架构。 仅当您根据模式检查了XML文档并发现它通过时,它才真正有效。

清单9显示了XML目录列表文件的基本RELAX NG模式。

清单9. RELAX NG模式
<?xml version="1.0" encoding="UTF-8"?>
<grammar ns="" xmlns=http://relaxng.org/ns/structure/1.0
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"><start><element name="xml"><oneOrMore><element name="file"><attribute name="name"><data type="NMTOKEN"/></attribute><attribute name="size"><data type="integer"/></attribute></element></oneOrMore></element></start>
</grammar>

RELAX NG易于阅读。 在顶部, element标签将名称xml定义为基本标签。 然后, oneOrMore的标签内xml标签命名filesize

ls2.xml文件对这个新模式有效吗? 参见清单10。

清单10.检查模式
% xml val -e -r ls.rng ls2.xml
ls2.xml - valid

如果您像我一样,直到看到失败,您才会感到满意。 因此,在名为someAttribute的文件中的一个文件项中添加一个名为someAttribute的属性,然后再次运行它(请参见清单11)。

清单11.根据模式检查错误的文件
% xml val -e -r ls.rng ls3.xml
ls3.xml:4: element file: Relax-NG validity error :
» Invalid attribute someAttribute for element file
ls3.xml - invalid

事实证明,它失败了。 您不仅知道文件格式正确,而且还知道它具有所有正确的标记和属性。

去发短信

您还可以使用选择功能,该功能使您可以从XML中提取数据元素。 清单12中的示例从XML目录列表中以纯文本形式提取文件名。

清单12.提取文件名
% xml sel -t -m "/xml/file" -v "concat(@name,'
')" ls2.xml
.DS_Store
build.xml
input.xml
main.xsl
Makefile
MyGenerator.class
MyGenerator.java

看这里两件事。 首先,要获取文件名的XPath是/xml/file规范。 其次,使用-v选项的输出规范将file标记上的name属性与回车符连接在一起。

现在,您可以添加-s选项,以按size属性对文件进行排序(请参见清单13)。 A:N:-语法告诉XMLStarlet使用升序数字排序。 (此代码将size参数添加到concat语句中以确保其正常工作。)

清单13.对列表进行排序
% xml sel -t -m "/xml/file" -s A:N:- "@size" -v "concat
» ( @name,':',@size,'
' ) " ls2.xml
build.xml:173
Makefile:184
input.xml:641
main.xsl:3587
MyGenerator.class:3869
MyGenerator.java:5265
.DS_Store:6148

一点交通乐趣

为了使xml命令更有趣,您可以使用它来分析流量报告。 Yahoo!®Maps提供交通服务。 您可以将curl命令与-g选项一起使用(对于GET ),以通过RSS下载最新的路况信息。 例如,在清单14中,我通过添加?csz=94101参数来指定邮政编码,其结果是最新的旧金山交通报告。

清单14.作为RSS的旧金山交通
% curl -g "http://maps.yahoo.com/traffic.rss?csz=94101" –s
<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="2.0">
<channel>
<title>Yahoo! Maps Traffic -- San Francisco,  CA 94101</title>
<link>http://us.rd.yahoo.com/maps/mapresults/trfrssarea/*
» http://maps.yahoo.com/maps_result?csz=
» San+Francisco%2C++CA+94101&country=
» us&lat=37.775&lon=
» -122.4183&trf=1&mag=5</link>
<category>Traffic</category>
<description>Yahoo! Maps Traffic --
» San Francisco,  CA 94101</description>
<language>en-us</language>
<ttl>3</ttl>
<lastBuildDate>Fri, 06 May 2005 16:33:59 -0700<
» /lastBuildDate>
<pubDate>Fri, 06 May 2005 18:31:27 CDT<
» /pubDate>
<copyright>Copyright (c) 2005 Yahoo! Inc.
» All rights reserved.</copyright>
<item>
<title>
Incident, On I-580 At Seminary Ave
</title>
<description>
Traffic Collision, Severity: Major, Started: 04:20pm 05/06/05,
» Estimated End: 04:50pm 05/06/05,
» Last Updated: 04:25pm 05/06/05
</description>
<link>http://us.rd.yahoo.com/maps/mapresults/trfrssitem/*
» http://maps.yahoo.com/maps_result?csz=
» San+Francisco%2C++CA+94101&mlt=
» 37.778234&mln=-122.168438&lat=
» 37.775&lon=-122.4183&trf=
» 1&exctrf=1&mag=4</link>
<pubDate>Fri, 06 May 2005 16:20:00 -0700</pubDate>
<category>Incident </category>
<severity>Major</severity>
<endDate>Fri, 06 May 2005 16:50:00 -0700</endDate>
<updatedDate>Fri, 06 May 2005 16:25:00 -0700<
» /updatedDate>
</item>
...

现在,您可以通过XMLStarlet命令通过管道传递curl命令的输出,以仅获取描述(参见清单15)。

清单15.通过XMLStarlet传递的流量RSS
% curl -g "http://maps.yahoo.com/traffic.rss?csz=94101"
» -s | xml sel -t -m "/rss/channel/item/description" -v "."
Traffic Collision, Severity: Major, Started: 04:20pm 05/06/05,
» Estimated End: 04:50pm 05/06/05,
» Last Updated: 04:25pm 05/06/05
Disabled Vehicle, Severity: Moderate, Started: 04:20pm 05/06/05,
» Estimated End: 04:50pm 05/06/05,
» Last Updated: 04:25pm 05/06/05
Disabled Vehicle, Severity: Moderate, Started: 04:19pm 05/06/05,
» Estimated End: 04:49pm 05/06/05,
» Last Updated: 04:25pm 05/06/05
Pedestrian On The Roadway, Severity: Critical,
» Started: 04:17pm 05/06/05,
» Estimated End: 04:47pm 05/06/05,
» Last Updated: 04:25pm 05/06/05
Traffic Collision, Severity: Major, Started: 04:15pm 05/06/05,
» Estimated End: 04:45pm 05/06/05,
» Last Updated: 04:25pm 05/06/05
...

-m选项选择每个项目的描述。 然后,使用-v选项,可以通过指定句点( . )仅输出节点的文本。

结论

本文勉强介绍了这个非常强大的XML工具的表面。 如果有时间,请查看XMLStarlet的XSLT转换功能,方便的转义和转义功能,XML格式化功能等。


翻译自: https://www.ibm.com/developerworks/opensource/library/x-starlet/index.html

xmlstarlet

xmlstarlet_开始使用XMLStarlet相关推荐

  1. 命令行的艺术 (GitHub 星标 6 万多)

    转自:GitHub github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md 熟练使用命令行是一种常常被忽视,或被认为难以掌握 ...

  2. What are some time-saving tips that every Linux us

    2019独角兽企业重金招聘Python工程师标准>>> Joshua Levy, Trust me. I'm a professional. Votes by Kartik Ayya ...

  3. 应该知道的Linux技巧

    这篇文章来源于Quroa的一个问答<What are some time-saving tips that every Linux user should know?>-- Linux用户 ...

  4. 命令行避免输入错误文件名_GitHub 60000+ Star 登顶,命令行的艺术

    今天给大家推荐一个GitHub开源项目<The Art of Command Line(命令行的艺术)>,这个开源项目雄踞了 GitHub TOP 周榜,直接以 61652 Star 登上 ...

  5. GitHub 五万星登顶,命令行的艺术!

    今天给大家推荐一个GitHub开源项目<The Art of Command Line(命令行的艺术)>,这个开源项目雄踞了 GitHub TOP 周榜,直接以 53972 Star 登上 ...

  6. Linux学习之常用技巧

    ▌基础 学习 Bash .你可以man bash来看看bash的东西,并不复杂也并不长.你用别的shell也行,但是bash是很强大的并且也是系统默认的.(学习zsh或tsch只会让你在很多情况下受到 ...

  7. 每个 Linux 用户都应该知道的命令行技巧

    每个 Linux 用户都应该知道的命令行技巧 原创 2015-09-11 伯乐在线 程序员的那些事 [伯乐在线导读]:有网友在问答网站Quora上提问:"有哪些省时小技巧,是每个Linux用 ...

  8. 你应该知道的 Linux 命令行技巧

    2019独角兽企业重金招聘Python工程师标准>>> 这篇文章来源于Quroa的一个问答<What are some time-saving tips that every ...

  9. 每个Linux用户都应该了解的命令行省时技巧

    英文链接: Linux: What are some time-saving tips that every Linux user should know? 有网友在问答网站Quora上提问:&quo ...

最新文章

  1. noip2006总结
  2. 精确记算程序的运行时间或者某段代码的运行时间
  3. Javascript Patterns--读书笔记8 (Factory)
  4. HDUOJ---2112HDU Today
  5. S4 extension field的异步创建和后台作业
  6. IE8下强制浏览器用哪个IE版本渲染页面
  7. bzoj3214 [Zjoi2013]丽洁体 dp
  8. 基于postman的api自动化测试实践
  9. JAVA中为什么要用接口定义编程_【Java公开课|为什么要用Java接口,这些内容你一定要搞清楚】- 环球网校...
  10. [2019.04.16] 由Python写成的自动解压脚本
  11. 基于Java的Office 系列文档处理五种工具简单介绍
  12. window.dialogArguments 使用问题
  13. 中国工业互联网相关政策汇总分析:“十四五”系列规划助力工业互联网创新融合发展[图]
  14. 数字频率计的功能及工作原理
  15. Android svc命令
  16. WEB前端学习 (3)CSS复习二 ( 复合选择器+元素显示模式+ 背景)
  17. 帅到没朋友分数 20
  18. CSS3中的一些新特性(CSS)
  19. 关于大学计算机相关专业学习路线的见解与分析
  20. 保底掉落装备matlab,DNF团本减负计划 保底深渊票史诗装备删除

热门文章

  1. Use explicit instantiation to minimize compile time and link time;
  2. 读懂正则表达式并学会简单的运用
  3. step7显示服务器,PCS 7 各服务器的功能咨询
  4. 树莓派自动浇水代码,树莓派云灌溉(三)
  5. postman编写记录
  6. 机架(Gantry)大体结构
  7. 在cocos2d-x3.0里面如何使用物理引擎:弹球
  8. 跟着鬼哥学android java hook(三)
  9. 收款鸿蒙系统手机,鸿蒙系统+ 升降镜头双重加持,荣耀智慧屏你心动没?
  10. 怎么给Win10分屏?