何时使用
shell下处理xml文件的一个可选方案(个人觉得比使用python、php处理xml方案好,感觉与shell下其它小工具能更好的整合与协作)
阅读建议
有XML、XPATH的基础,这里有快餐教教程
http://www.w3school.com.cn/x.asp
相关资源
1)官方网址,
http://xmlstar.sourceforge.net/
3)使用介绍,又是IBM上的文章;
http://www.ibm.com/developerworks/cn/xml/x-xmlcert/
在ubuntu下的安装
最简单的方式:sudo apt-get install xmlstarlet
使用事例
1)使用说明,具体man xmlstartlet
2)于xml格式列表某个目录信息
3)提取xml文件中的某些内容
xmlstarlet sel 的用法
luogw@ubuntu:~$ xmlstarlet sel --help
XMLStarlet Toolkit: Select from XML document(s)
Usage: xmlstarlet sel <global-options> {<template>} [ <xml-file> ... ]
where
<global-options> - global options for selecting
<xml-file> - input XML document file name/uri (stdin is used if missing)
<template> - template for querying XML document with following syntax:
<global-options> are:
-Q or --quiet - do not write anything to standard output.
-C or --comp - display generated XSLT
-R or --root - print root element <xsl-select>
-T or --text - output is text (default is XML)
-I or --indent - indent output
-D or --xml-decl - do not omit xml declaration line
-B or --noblanks - remove insignificant spaces from XML tree
-E or --encode <encoding> - output in the given encoding (utf-8, unicode...)
-N <name>=<value> - predefine namespaces (name without 'xmlns:')
ex: xsql=urn:oracle-xsql
Multiple -N options are allowed.
--net - allow fetch DTDs or entities over network
--help - display help
Syntax for templates: -t|--template <options>
where <options>
-c or --copy-of <xpath> - print copy of XPATH expression
-v or --value-of <xpath> - print value of XPATH expression
-o or --output <string> - output string literal
-n or --nl - print new line
-f or --inp-name - print input file name (or URL)
-m or --match <xpath> - match XPATH expression
--var <name> <value> --break or
--var <name>=<value> - declare a variable (referenced by $name)
-i or --if <test-xpath> - check condition <xsl:if test="test-xpath">
--elif <test-xpath> - check condition if previous conditions failed
--else - check if previous conditions failed
-e or --elem <name> - print out element <xsl:element name="name">
-a or --attr <name> - add attribute <xsl:attribute name="name">
-b or --break - break nesting
-s or --sort op xpath - sort in order (used after -m) where
op is X:Y:Z,
X is A - for order="ascending"
X is D - for order="descending"
Y is N - for data-type="numeric"
Y is T - for data-type="text"
Z is U - for case-order="upper-first"
Z is L - for case-order="lower-first"
There can be multiple --match, --copy-of, --value-of, etc options
in a single template. The effect of applying command line templates
can be illustrated with the following XSLT analogue
xml sel -t -c "xpath0" -m "xpath1" -m "xpath2" -v "xpath3" \
-t -m "xpath4" -c "xpath5"
is equivalent to applying the following XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:call-template name="t1"/>
<xsl:call-template name="t2"/>
</xsl:template>
<xsl:template name="t1">
<xsl:copy-of select="xpath0"/>
<xsl:for-each select="xpath1">
<xsl:for-each select="xpath2">
<xsl:value-of select="xpath3"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<xsl:template name="t2">
<xsl:for-each select="xpath4">
<xsl:copy-of select="xpath5"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
XMLStarlet is a command line toolkit to query/edit/check/transform
XML documents (for more information see http://xmlstar.sourceforge.net/)
Current implementation uses libxslt from GNOME codebase as XSLT processor
(see http://xmlsoft.org/ for more details)
提取内容:每行显示一行内容
处理的xml文档如下:
<xml>
<table>
<rec id="1">
<numField>123</numField>
<stringField>first string</stringField>
</rec>
<rec id="2">
<numField>346</numField>
<stringField>second string</stringField>
</rec>
<rec id="3">
<numField>-23</numField>
<stringField>third string</stringField>
</rec>
</table>
处理结果如下:
对等的xsl文件如下:使用 -C 选项
luogw@ubuntu:/media/disk1/research/xmlStarlet$ xmlstarlet sel -T -t -m /xml/table/rec -v "concat(@id, '|', numField,'|', stringField)" -n table.xml
1|123|first string
2|346|second string
3|-23|third string
对等的xsl文件如下:使用 -C 选项
luogw@ubuntu:/media/disk1/research/xmlStarlet$ xmlstarlet sel -C -T -t -m /xml/table/rec -v "concat(@id, '|', numField,'|', stringField)" -n table.xml
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" version="1.0" extension-element-prefixes="exslt">
<xsl:output omit-xml-declaration="yes" indent="no" method="text"/>
<xsl:template match="/">
<xsl:for-each select="/xml/table/rec">
<xsl:call-template name="value-of-template">
<xsl:with-param name="select" select="concat(@id, '|', numField,'|', stringField)"/>
</xsl:call-template>
<xsl:value-of select="'
'"/>
</xsl:for-each>
</xsl:template>
<xsl:template name="value-of-template">
<xsl:param name="select"/>
<xsl:value-of select="$select"/>
<xsl:for-each select="exslt:node-set($select)[position()>1]">
<xsl:value-of select="."/>
<xsl:value-of select="'
'"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>