在linux终端或者secureCRT ssh上去,或者是shell脚本可以直接调用xmlstarlet命令操作,解析xml很方便,由于是工作上用到的东东,查了相关的资料,也遇到过一些问题,所以在解决后记录备忘,这里只列出一些常用的命令和一些文档里没有提到的命令,如需文档,请参考:http://xmlstar.sourceforge.net/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.sourceforge.net/
随便下载一个版本,这个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
root/aaa
root/bbb
4.操作方法之查询结点值
语法:xml sel <global-options> {<template>} [ <xml-file> ... ]
example1:
xml sel -t -v /root/bbb test.xml #-t表示使用模板,-v就是模板参数,表示取路径的值即value of
输出:
zhang ling
(注:zhang ling后有一个空行,可见该语句是把<bbb>和</bbb>之间的值完整的输出,-v指定的结点路径一定要以"/"开头,不要然不同的机器可能执行不成功,之后的结点路径都是这样)
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"?>
<root>
<aaa>he peng</aaa>
<bbb>123</bbb>
<aaa>multiple</aaa>
</root>
(注:不但更新了值,还格式化了输出,还加了xml头)
example2:(更新多结点的值)
xml ed -u /root/aaa -v 123 test.xml
输出:
<?xml version="1.0"?>
<root>
<aaa>123</aaa>
<bbb>zhang ling
</bbb>
<aaa>123</aaa>
</root>
这样就把所有的/root/aaa改了
example3:(更新多结点的某一个的值)
xml ed -u /root/aaa[2] -v 123 test.xml
输出:
<?xml version="1.0"?>
<root>
<aaa>he peng</aaa>
<bbb>zhang ling
</bbb>
<aaa>123</aaa>
</root>
example4:(删除多结点的某一个)
xml ed -d /root/aaa[2] test.xml # -d 是delete
输出:
<?xml version="1.0"?>
<root>
<aaa>he peng</aaa>
<bbb>zhang ling
</bbb>
</root>
6.操作方法验证有效性
xml val test.xml
输出:
test.xml - valid
表明有效,是符合语法的xml形式