免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1563 | 回复: 0
打印 上一主题 下一主题

XMLStarlet 使用入门 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-31 15:57 |只看该作者 |倒序浏览

XMLStarlet 使用入门
用于从命令行处理 XML 的开放源码工具箱



Jack Herrington
(
[email=jack_d_herrington@codegeneration.net?subject=XMLStarlet 使用入门&cc=dwxed@us.ibm.com]jack_d_herrington@codegeneration.net[/email]
), 主编, Code Generation Network
2005 年 6 月 27 日
了解如何通过 XMLStarlet 命令行工具、使用简单的命令对 xml 进行格式化、转换、修正和编辑。Jack Herrington 告诉您掌握这种强大的工具多么轻而易举,它可以大幅度地简化您的工作。
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 脚本以便设置构建脚本,然后运行 make install 构建包并安装。如果您不是超级用户,应该使用 sudo make install 以便将命令安装到 system 目录中。
可能还需要访问 XML、XSLT 和 XML Path Language (XPath) 页面以便及时更新这三个标准,这对于充分利用 XMLStarlet 非常重要(请参阅
参考资料
)。
基础
安装完成后,现在可以对 XMLStarlet 做一番漫游了。首先不带参数运行 xml 命令(参见清单 1)。
清单 1. XMLStarlet 帮助页
                               
% xml
XMLStarlet Toolkit: command-line utilities for XML
Usage: xml []  []
where  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
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  --help  for command help
XMLStarlet is a command line toolkit to query/edit/check/transform
XML documents (for more information see http://xmlstar.sourceforge.net/)
所有命令的基本格式为 xml ,后面跟一些选项。了解每个选项可以使用 xml  --help 命令。比如,清单 2 显示了编辑(ed)命令的帮助。
清单 2. 编辑命令的帮助
                               
% xml ed --help
XMLStarlet Toolkit: Edit XML document(s)
Usage: xml ed  {} [  ... ]
where
  - global options for editing
- input XML document file name/uri (stdin otherwise)
are:
-P (or --pf)        - preserve original formatting
-S (or --ps)        - preserve non-significant spaces
-O (or --omit-decl) - omit XML declaration ()
-N =   - 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
-d or --delete
-i or --insert  -t (--type) elem|text|attr -n  -v (--value)
-a or --append  -t (--type) elem|text|attr -n  -v (--value)
-s or --subnode  -t (--type) elem|text|attr -n  -v (--value)
-m or --move  
-r or --rename  -v
-u or --update  -v (--value)
-x (--expr)  (-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 节点或者改变节点的值,等等。

长代码行
本文中的一些代码行很长,如果不断开就无法在窗口中显示出来。这些行在代码清单中被折叠起来,虽然在实际的命令行中只有一行。这些行用 » 符号表示(比如清单 3)。


XML 目录列表
使用 XMLStarlet 需要有 XML,因此我们介绍第一个命令 xml ls,它用 XML 给出当前目录的列表。清单 3 给出了一个例子。
清单 3. XML 目录列表
                               
% xml ls
   
   
   
   
   
   
   
   
   
   
   
如果认为目录列表显示的信息太多了,可以(比方说)去掉目录节点,如清单 4 所示。
清单 4. 不含目录节点的列表
                               
% xml ls | xml ed -d "//d"
   
   
   
   
   
   
   
使用编辑命令(ed)从 XML 中去掉了 d 节点。ls 命令把目录输出到标准输出。管道符(|)将标准输出重定向到编辑命令的标准输入,编辑命令从列表中删除 d 节点。使用 XPath 表达式 //d 指定 d 节点,它和树中所有层次上的 d 节点匹配。如果要更加准确,可以使用 /xml/d。
现在,假设要删除 a 和 m 属性(如清单 5 所示)。
清单 5. 删除 a 和 m 属性的目录列表
                               
% xml ls | xml ed -d "//d" -d "//@a" -d "//@m" -d "//@p"
   
   
   
   
   
   
   
现在更简洁了,清单中只剩下了文件,文件节点中只能看到文件的大小和名称。为了更便于跟踪,可以将结果保存在一个名为 ls.xml 的文件中。也可使用 rename 编辑函数将 f 标签修改为 file(如清单 6 所示)。
清单 6. 显示大小和文件名属性的目录列表
                               
% cat ls.xml | xml ed -r "//f" -v "file"
   
   
   
   
   
   
   
此外,如果标签和属性不愿意使用短名字如 s 和 n,可以分别将其修改为 size 和 name(如图 7 所示)。
清单 7. 使用 file 标签的目录列表
                               
% cat ls.xml | xml ed -r "//f" -v "file" -r "//@s" -v "size" -r "//@n" -v "name"
   
   
   
   
   
   
   
这样读起来更容易了。到现在还没有写一行 XSLT、Perl 或 Java 代码。将该文件保存为 ls2.xml。


验证
新的目录列表看起来不错,那么是不是仍然有效呢?清单 8 说明了如何来进行判断。
清单 8. 检查 XML 的良构性
                               
% xml val ls2.xml
ls2.xml - valid
啊,是有效的。就是说它是结构良好的,即标签是平衡的、字符编码是正确的等等。但是仍然可能缺少必要的标签或者正确的标签。为此必须知道文件的正确结构,因此需要一个模式。只有用模式检查 XML 文档并且通过之后才能说它是有效的。
清单 9 显示了 XML 目录列表文件的基本 RELAX NG 模式。
清单 9. RELAX NG 模式
                               
  
   
      
        
         
            
         
         
            
         
        
      
   
  
RELAX NG 读起来很容易。最上面的 element 标签定义了 xml 作为基本标签。然后,xml 标签中的 oneOrMore 标签被命名为 file 和 size。
ls2.xml 文件对于这个新的模式有效吗?请参阅清单 10。
清单 10. 用模式检查
                               
% xml val -e -r ls.rng ls2.xml
ls2.xml - valid
如果您像我一样 —— 只有看到错误才会满足,那么可以在 ls3.xml 文件中的一个文件节点中添加属性 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
Yahoo! Maps Traffic -- San Francisco,  CA 94101
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
Traffic
Yahoo! Maps Traffic --
» San Francisco,  CA 94101
en-us
3
Fri, 06 May 2005 16:33:59 -0700
Fri, 06 May 2005 18:31:27 CDT
Copyright (c) 2005 Yahoo! Inc.
» All rights reserved.
Incident, On I-580 At Seminary Ave
Traffic Collision, Severity: Major, Started: 04:20pm 05/06/05,
» Estimated End: 04:50pm 05/06/05,
» Last Updated: 04:25pm 05/06/05
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
Fri, 06 May 2005 16:20:00 -0700
Incident
Major
Fri, 06 May 2005 16:50:00 -0700
Fri, 06 May 2005 16:25:00 -0700
...
现在可以将 curl 命令的输出通过 XMLStarlet 命令去除其中的描述部分(如清单 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 格式化功能等等。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/31547/showart_2014398.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP