1. 下载tar包 http:///projects/sfnet_xmlstar/releases/
2. 解压, install 把下载的文件 放入到 /opt 或者别的文件夹下, 然后
xmlstarlet toolkit 脚本操作xml的好工具, 用法心得、 在linux终端或者secureCRT ssh上去,或者是shell脚本可以直接调用xmlstarlet命令操作,解析xml很方便,由于是工作上用到的东东,查了相关的资料,也遇到过一些 问题,所以在解决后记录备忘,这里只列出一些常用的命令和一些文档里没有提到的命令,如需文档,请参考:http://xmlstar./doc/UG/xmlstarlet-ug.html 例子的测试xml文件都以test.xml为准: test.xml文件内容如下: <root> <aaa>he peng</aaa> <bbb>zhang ling </bbb> <aaa>multiple</aaa> </root> 1.下载 下载地址:http://xmlstar./ 随便下载一个版本,这个xmlstarlet是用c语言实现的,需要依赖libxml库,所以,如果你的libxml版本太低了,那就下载一个版本低的xmlstar先练练手吧
2.安装 解压后 sudo ./configure sudo ./make sudo ./make install
3.操作方法之转换结点 example 1:(注:有些系统安装好xmlstarlet命令后使用的命令名可能叫xmlstarlet,而不是例子中的xml命令) xml el test.xml 输出: root root/aaa root/bbb root/aaa (注:xml命令只是把处理结果输出到控制台,并不直接改变原来文件的任何地方) example2:唯一结点(unique) xml el -u test.xml 输出: root 4.操作方法之查询结点值 语法:xml sel <global-options> {<template>} [ <xml-file> ... ] example1: xml sel -t -v /root/bbb test.xml #-t表示使用模板,-v就是模板参数,表示取路径的值即value of 输出: zhang ling example2:(输出第二个aaa的值) xml set -t -v /root/aaa[2] test.xml 输出: multiple (注: 如果有重复的相同结点,如果有属性可以区分,可以指定属性,如:/root/aaa[@name],表示/root/aaa结点,属性为name,当然例 子没有属性,所以我们使用数字,使用数字的方法是同事无意中试出来的哦!文档我找了很久都没找到,这也因为这个问题出现在工作中,所以研究了一阵) 5.操作方法之更新结点值 语法:xml ed <global-options> {<action>} [ <xml-file-or-uri> ... ] example1:(更改指定结点的值) xml ed -u /root/bbb -v 123 test.xml #-u 是update -v 是value 输出: <?xml version="1.0"?> example2:(更新多结点的值) xml ed -u /root/aaa -v 123 test.xml 输出: <?xml version="1.0"?> 这样就把所有的/root/aaa改了 example3:(更新多结点的某一个的值) xml ed -u /root/aaa[2] -v 123 test.xml 输出: <?xml version="1.0"?> example4:(删除多结点的某一个) xml ed -d /root/aaa[2] test.xml # -d 是delete 输出: <?xml version="1.0"?> 6.操作方法验证有效性 xml val test.xml 输出: test.xml - valid
http://www.ibm.com/developerworks/cn/xml/x-starlet.html
XMLStarlet 使用入门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 主页下载最新的构建包(请参阅 参考资料)。运行 可能还需要访问 XML、XSLT 和 XML Path Language (XPath) 页面以便及时更新这三个标准,这对于充分利用 XMLStarlet 非常重要(请参阅 参考资料)。 基础安装完成后,现在可以对 XMLStarlet 做一番漫游了。首先不带参数运行 清单 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 help XMLStarlet is a command line toolkit to query/edit/check/transform XML documents (for more information see http://xmlstar./) 所有命令的基本格式为 清单 2. 编辑命令的帮助% 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 help where <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./) 这份帮助文件看起来很复杂,但最重要的部分在下面,可以看到如何删除、插入 XML 节点或者改变节点的值,等等。 长代码行本文中的一些代码行很长,如果不断开就无法在窗口中显示出来。这些行在代码清单中被折叠起来,虽然在实际的命令行中只有一行。这些行用 ? 符号表示(比如清单 3)。 XML 目录列表使用 XMLStarlet 需要有 XML,因此我们介绍第一个命令 清单 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> 使用编辑命令( 现在,假设要删除 清单 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 的文件中。也可使用 清单 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> 此外,如果标签和属性不愿意使用短名字如 清单 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.xml ls2.xml - valid 啊,是有效的。就是说它是结构良好的,即标签是平衡的、字符编码是正确的等等。但是仍然可能缺少必要的标签或者正确的标签。为此必须知道文件的正确结构,因此需要一个模式。只有用模式检查 XML 文档并且通过之后才能说它是有效的。 清单 9 显示了 XML 目录列表文件的基本 RELAX NG 模式。 清单 9. RELAX NG 模式<?xml version="1.0" encoding="UTF-8"?> <grammar ns="" xmlns=http:///ns/structure/1.0 datatypeLibrary="http://www./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 读起来很容易。最上面的 ls2.xml 文件对于这个新的模式有效吗?请参阅清单 10。 清单 10. 用模式检查% xml val -e -r ls.rng ls2.xml ls2.xml - valid 如果您像我一样 —— 只有看到错误才会满足,那么可以在 ls3.xml 文件中的一个文件节点中添加属性 清单 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 是 现在增加 清单 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 牛刀小试为了让 清单 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> ... 现在可以将 清单 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 ...
结束语本文粗略地介绍了这种强大的 XML 工具。有时间的话,不妨试一试 XMLStarlet 的 XSLT 转换功能、方便的转义和取消转义功能以及 XML 格式化功能等等。 |
|