最初的需求是希望bash能提供完整成熟的xml解析工具来解析xml,但是并没有找到这样的工具。后来在StackOverFlow上找到一个简单的处理xml的方法,即:
1 |
|
方法只有一行!(当然,两条语句应该算是两行……)
当然,这也只能处理最简单原始的xml,不能处理带属性的,不能有注释等等。
由于楼主过于懒惰,不想引入(学习)新的脚本语言,所以打算改造上面的方法。
改造之前,先来解释一下上面那行语句的意义。
其实很简单,这行命令的作用就是读取<与下一个<之间的字符
(xml中,如果在节点本身之外存在<或者>,属性值含有空格,则函数失效,所以我们假设xml中没有此情况)
有了上面的假设,那么两个<字符直接,就一定会有一个>字符,>将read读取的内容分为两部分,分别记做E和C,举个简单的例子:
1 |
|
第一次执行rdom时,read读取到<即结束了,所以E和C都是空字符串。
第二次执行rdom时,read读取到的内容为:tag>value,然后是<字符,read结束。所以E=tag;C=value
第三次执行rdom时,read读取到的内容为:/tag>到下一个<或文件末尾。所以E=/tag,C为空白符。
所以这种方式并不实用,我们想支持带属性的节点,我们也不想删除xml中的注释,我们甚至还想解析xml的声明,我们……好了,我们想的太多了。我们还是看看能做些什么吧。
我们可以看出,<>里面的部分是作为整体赋值给E的,那么解析属性就要对E做手脚。
(我们假设xml中,在节点本身之外存在没有<和>,属性值中也没有空格)
下面我们来操作一下,首先先引入一个输入空格,用来显示层级的函数echo_tabs
1 2 3 4 5 6 7 |
|
然后我们来解析xml中的声明,就是下面这部分
1 |
|
声明与其他标签闭合方式不同,并且尖括号内两端是?,所以这里要把它与普通节点区分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
下面我们来解析注释。注释让人烦恼的地方是,注释内可以包含尖括号!这里只做最简单处理,只解析不含尖括号的注释!
1 2 3 |
|
现在我们看xml中最关键的部分
我们知道,CONTENT为节点的内容,显示出来就可以了
1 2 3 |
|
节点自身属性都在ENTITY中,所以我们需要将节点名称与属性分开,然后再提取属性名和属性值
我们分别处理下面几种形式的节点
1 2 3 4 |
|
我们之前已经将节点名称与属性分开了
1 2 |
|
但是上面的ATTRIBUTES变量会有个小问题,稍后说明
ELEMENT如果以/开头,那么这是读取到节点的闭合标签了
ELEMENT如果以/结尾,那么这是一个空标签,类似
其他情况ELEMENT均为节点名称,但是读取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
|
对下面xml执行此脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
输出结果为
Atas ialah kandungan terperinci 如何使用bash解析xml的示例代码分析. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!