您的位置:首页 > 运维架构 > Shell

如何方便的使用shell脚本来解析xml文件

2012-10-10 22:20 861 查看
最近在项目中,需要用到shell脚本来解析xml文件。在网上搜了一下,发现有xmlsh等可以用,但是都需要下载安装,使用比较麻烦,后来经过查找在stackoverflow上找到了解决方法,将脚本记录如下。

项目中的主要需求为: 在xml文件中,需要配置连接的服务器的IP和端口号等信息,供游戏逻辑程序作为服务的客户端进行解析使用。但同时,这些IP和端口号也是在进行服务器部署时需要配置的,因而这份配置在两个地方需要用到。

一开始考虑到服务器部署脚本中解析文本方便一些,因而同一份配置编写了2份。但后来考虑到后续部署的方便和较少人工配置出错的可能性,因而想到直接在部署脚本中使用xml文件来配置服务器的IP和端口号相关信息。具体脚本如下:

#!/bin/sh

Usage()
{
echo "Usage: ./install_all.sh <ranksvr_config.xml>"
exit 1
}

if [ $# -ne 1 ]
then
Usage
fi

if [ ! -e "$1" ]
then
echo "fail to load data from file, file $1 not exist!"
exit 1
fi

attrget()
{
ATTR_PAIR=${1#*$2=\"}
echo "${ATTR_PAIR%%\"*}"
}

install_all_svrs()
{
if [ $# -ne 1 ]
then
echo "Invalid call of function install_all_svrs, no input file!"
exit 1
fi

local IFS=\>

while read -d \< ENTITY CONTENT
do
TAG_NAME=${ENTITY%% *}
ATTRIBUTES=${ENTITY#* }

if [[ $TAG_NAME == "group" ]]
then
GROUP=`attrget ${ATTRIBUTES} "id"`
HOST=`attrget ${ATTRIBUTES} "host"`
PORT=`attrget ${ATTRIBUTES} "port"`
HTTPPORT=`attrget ${ATTRIBUTES} "httpport"`

echo "./install.sh $GROUP $HOST $PORT $HTTPPORT"
./install.sh $GROUP $HOST $PORT $HTTPPORT
fi
done < $1
}

install_all_svrs $1

#while read -d
#do
#       var=`echo ${line} | awk '$1 ~/^[0-9]+$/ {print $1}'`
#       if [ -z ${var} ]
#       then
#               continue;
#       fi

#       ./install.sh $line

#done < $1


其中,xml文件的解析代码主要在install_all_svrs函数中。具体原理主要还是利用shell的字符串处理技巧,下面主要分析几个主要的技巧:

${StrName%%TAG*} 表示截取字符串从左向右的第一个TAG之前的字符串;

${StrName#*TAG} 表示截取字符串从左向右的第一个TAG分割的之后的字符串,包含TAG;

${StrName%%TAG} 表示截取字符串从左向右的第一个TAG分割之前的字符串,不包含TAG;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: