XMLStarlet 命令行操作xml利器
来源:互联网 发布:拍电影知乎 编辑:程序博客网 时间:2024/05/22 10:23
XMLStarlet用于从命令行处理 XML 的开放源码工具箱
XMLStarlet 是一种开放源码的 XML 工具箱,可以在 UNIX®、Mac OS® X 或 Microsoft® Windows® 命令行中使用。XMLStarlet 可以验证 XML、格式化 XML、选择其中的一部分、用 XSLT 进行转换甚至编辑。这意味着,不需要使用 Perl 或 Java® 之类的编程语言编写任何自定义的代码,就可以在 shell 脚本中加入 XML 工具。
使用 XMLStarlet 需要安装它,而安装需要 libxml2 和 libxslt2 库。在 Windows 上不需要安装 libxml2 和 libxslt2,因为 Win32 包已经包含了。可以下载 Win32 可执行文件并将其安装到方便从命令行执行的任何位置。如果运行 UNIX,而机器上还没有 libxml2 和 libxslt2,则必须下载并安装。
然后转到 XMLStarlet 主页下载最新的构建包。运行 ./configure
--prefix=/usr/local/xmlstar脚本以便设置构建脚本,然后运行 make install
构建包并安装。如果您不是超级用户,应该使用 sudo make install
以便将命令安装到 system 目录中。
安装过程可能遇到的问题:
1. configure: error: xml2-config not found,
解决方案:
sudo yum install libxml2
sudo yum install libxml2-devel -y
2. configure: error: xslt-config not found
解决方案:
sudo yum install libxslt-devel
可能还需要访问 XML、XSLT 和 XML Path Language (XPath) 页面以便及时更新这三个标准,这对于充分利用 XMLStarlet 非常重要。
基础
安装完成后,现在可以对 XMLStarlet 做一番漫游了。首先不带参数运行 xml
命令。
% xmlXMLStarlet Toolkit: command-line utilities for XMLUsage: 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 XSLTval (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 documentc14n (or canonic) - XML canonicalizationls (or list) - List directory as XMLesc (or escape) - Escape special XML charactersunesc (or unescape) - Unescape special XML characterspyx (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 helpWherever file name mentioned in command help it is assumedthat URL can be used instead as well.Type: xml <command> --help <ENTER> for command helpXMLStarlet is a command line toolkit to query/edit/check/transformXML documents (for more information see http://xmlstar.sourceforge.net/)
所有命令的基本格式为 xml <command>
,后面跟一些选项。了解每个选项可以使用 xml <command> --help
命令
% xml ed --helpXMLStarlet 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-xsqlMultiple -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/transformXML documents (for more information see http://xmlstar.sourceforge.net/)
XML 目录列表
使用 XMLStarlet 需要有 XML,因此我们介绍第一个命令 xml ls
,它用 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>
使用编辑命令(ed
)从 XML 中去掉了 d
节点。ls
命令把目录输出到标准输出。管道符(|
)将标准输出重定向到编辑命令的标准输入,编辑命令从列表中删除 d
节点。使用 XPath 表达式 //d
指定 d
节点,它和树中所有层次上的 d
节点匹配。如果要更加准确,可以使用 /xml/d
。
现在,假设要删除 a
和 m
属性(如清单 5 所示)
% 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>
此外,如果标签和属性不愿意使用短名字如 s
和 n
,可以分别将其修改为 size
和 name
(如图 7 所示)。
清单 7. 使用 file 标签的目录列表
% 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.xmlls2.xml - valid
啊,是有效的。就是说它是结构良好的,即标签是平衡的、字符编码是正确的等等。但是仍然可能缺少必要的标签或者正确的标签。为此必须知道文件的正确结构,因此需要一个模式。只有用模式检查 XML 文档并且通过之后才能说它是有效的。
清单 9 显示了 XML 目录列表文件的基本 RELAX NG 模式。
<?xml version="1.0" encoding="UTF-8"?><grammar ns="" xmlns=http://relaxng.org/ns/structure/1.0datatypeLibrary="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
作为基本标签。然后,xml
标签中的 oneOrMore
标签被命名为 file
和size
。
ls2.xml 文件对于这个新的模式有效吗?请参阅清单 10
% xml val -e -r ls.rng ls2.xmlls2.xml - valid
如果您像我一样 —— 只有看到错误才会满足,那么可以在 ls3.xml 文件中的一个文件节点中添加属性 someAttribute
,然后再检查该文件(参见清单 11)。
清单 11. 用模式检查错误的文件
% xml val -e -r ls.rng ls3.xmlls3.xml:4: element file: Relax-NG validity error : » Invalid attribute someAttribute for element filels3.xml - invalid结果证明失败了。不但要知道文件是结构良好的,还要知道所有的标签和属性都是正确的。
文本
还可以使用选择函数从 XML 提取数据元素。清单 12 中的例子从 XML 目录中提取文件名作为普通文本。
清单 12. 提取文件名
% xml sel -t -m "/xml/file" -v "concat(@name,'')" ls2.xml.DS_Storebuild.xmlinput.xmlmain.xslMakefileMyGenerator.classMyGenerator.java
这里要注意两点。首先,提取文件名的 XPath 是 /xml/file
条款。其次使用 -v
选项的输出说名用回车换行连接 file
标签中的 name
属性。
现在增加 -s
选项,按照 size
属性对文件排序(参见清单 13)。 A:N:-
语法告诉 XMLStarlet 按照数值大小递增排序。(这里将 size
参数添加到 concat
语句中以便能正常工作。)
% xml sel -t -m "/xml/file" -s A:N:- "@size" -v "concat » ( @name,':',@size,'' ) " ls2.xmlbuild.xml:173Makefile:184input.xml:641main.xsl:3587MyGenerator.class:3869MyGenerator.java:5265.DS_Store:6148
获取xml属性:
xml sel -t -v "/manifest/@versionCode" AndroidManifest.xmlandroid工程配置文件根目录下的versionCode属性的值。
修改属性:
xml ed -L -u "/manifest/@android:versionName" -v "9.9.9" AndroidManifest.xml
- XMLStarlet 命令行操作xml利器
- 命令行编辑XML的最佳实践(修改版xmlstarlet)
- xmlstarlet toolkit 脚本操作xml的好工具, 用法心得
- editplus XMLStarlet格式化xml 文件
- 有关XMLStarlet
- 命令行下载利器- Aria2
- Linux命令行ftp利器lftp
- sendmail-命令行发邮件利器
- Cmder--Windows下命令行利器
- Cmder--Windows下命令行利器
- centos7下安装xmlstarlet
- XML解析利器:Digester
- delphi7的XML利器
- XML 处理利器 : XStream
- XML处理利器:XStream
- 日志操作利器log4cxx
- Byobu 命令行终端的强大利器
- 解析XML的利器-TinyXML
- 根据PV算并发量(有点小道理,但只是估算,还是应有监控系统,看当日峰值)
- 分享使用Unity 3D免费版本编写游戏的教程
- 友盟多渠道获取渠道名 附赠多渠道打包文件
- 让生成的程序默认有管理员权限
- Android多个依赖项目Ant编译命令
- XMLStarlet 命令行操作xml利器
- LeetCode -- Reverse Nodes in k-Group
- Android网络通信的六种方式
- Git学习教程(分支与合并)
- ios俩个APP之间跳转、传值
- linux解决文件名乱码
- mysql模糊查询
- Android MediaPlayer各种状态切换
- 虚拟机ubuntu系统出现的循环登录界面解决方法