使用bash解析xml的案例分析

  介绍

这篇文章给大家分享的是有关使用bash解析xml的案例分析的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

,最初的需求是希望bash能提供完整成熟的xml解析工具来解析xml,但是并没有找到这样的工具。后来在StackOverFlow上找到一个简单的处理xml的方法,即:

rdom(){当地IFS=\比;;阅读- d \ & lt;E C;}

方法只有一行!(当然,两条语句应该算是两行……)

当然,这也只能处理最简单原始的xml,不能处理带属性的,不能有注释等等。

由于楼主过于懒惰,不想引入(学习)新的脚本语言,所以打算改造上面的方法。

改造之前,先来解释一下上面那行语句的意义。

其实很简单,这行命令的作用就是读取& lt;与下一个& lt;之间的字符

(xml中,如果在节点本身之外存在& lt;或者祝辞,属性值含有空格,则函数失效,所以我们假设xml中没有此情况)

有了上面的假设,那么两个& lt;字符直接,就一定会有一个在字符,在将阅读读取的内容分为两部分,分别记做E和C,举个简单的例子:

& lt; tag> value

第一次执行rdom时,阅读读取到& lt;即结束了,所以E和C都是空字符串。

第二次执行rdom时,阅读读取到的内容为:tag>价值,然后是& lt;字符,读结束,所以E=标签;C=价值

第三次执行rdom时,阅读读取到的内容为:/tag>到下一个& lt;或文件末尾。所以E=/标签,C为空白符。

所以这种方式并不实用,我们想支持带属性的节点,我们也不想删除xml中的注释,我们甚至还想解析xml的声明,我们……好了,我们想的太多了。我们还是看看能做些什么吧。

我们可以看的出,& lt;祝辞里面的部分是作为整体赋值给E的,那么解析属性就要对E做手脚。

(我们假设xml中,在节点本身之外存在没有& lt;和祝辞,属性值中也没有空格)

下面我们来操作一下,首先先引入一个输入空格,用来显示层级的函数echo_tabs

echo_tabs () {   当地标签=?“;   ((我=0;我& lt;1美元;我+ +));做   标签=$标签# 39;& # 39;# 4个空格   完成   echo - n“tabs"美元;#一定要加双引号   }

然后我们来解析xml中的声明,就是下面这部分

& lt; ?xml version=?.0”;编码=皍tf-8" ?在

声明与其他标签闭合方式不同,并且尖括号内两端是吗?,所以这里要把它与普通节点区分。

read_dom () {   #备份IFS   当地oldIFS=$ IFS      当地IFS=\比;#字段分割符改为比;   阅读- d \ & lt;实体内容#阅读分隔符改为& lt;   当地ret=$ ?   局部元素=& # 39;& # 39;   第#第一次执行时,一个字符为& lt;。   #所以读执行完毕、实体和内容都是空白符   如果[[$实体=~ ^[[:空间:]]* $]],,[[$内容=~ ^[[:空间:]]*美元]];然后   返回ret美元   fi      xml version==#实体?“1.0”;编码=皍tf-8" ?   #解析xml声明,并非普通节点,闭合方式与节点不同   如果[[“ENTITY"美元;=~ ^ \ ? xml[[:空间:]]* (. *)\ ?$]];然后#使用正则去除问号和xml字符   实体=& # 39;& # 39;   元素=& # 39;& # 39;#不是普通节点   属性=? {BASH_REMATCH [1]}“;#获取声明中的属性   其他#普通节点   元素=${实体% % *}#获取节点名称,如果实体中有空格,则第一个空格前面部分即为节点名称   实体属性=${# *}#获取节点所有属性,如果实体中有空格,则第一个空格后面部分为所有属性(# 2和# 4,# 4情况下,会多出/)   fi   }

下面我们来解析注释。注释让人烦恼的地方是,注释内可以包含尖括号!这里只做最简单处理,只解析不含尖括号的注释!

如果[[“ENTITY"美元;=\ !——*——]];然后#不检查注释   返回0   fi

现在我们看xml中最关键的部分

我们知道,内容为节点的内容,显示出来就可以了

如果[[!“CONTENT"美元;=~ ^[[:空间:]]* $]];然后   echo - n=$内容内容   fi

节点自身属性都在实体中,所以我们需要将节点名称与属性分开,然后再提取属性名和属性值

我们分别处理下面几种形式的节点

& lt;测试=?“/比;   & lt; test> & lt;/test>   & lt; test> abc   & lt;测试/祝辞

我们之前已经将节点名称与属性分开了

元素=${实体% % *}#获取节点名称,如果实体中有空格,则第一个空格前面部分即为节点名称   实体属性=${# *}#获取节点所有属性,如果实体中有空格,则第一个空格后面部分为所有属性(# 2和# 4,# 4情况下,会多出/)

使用bash解析xml的案例分析