前言
前几天在干活的时候遇到一个需要解析处理xml文件的一个需求,当时考虑到逻辑比较复杂,因此用java慢慢搞了搞。不过这个需求经常会变,每次变化之后都要重新找到jar包的代码,改了之后还要替换原来的jar包,一来不方便修改,二来不方便统一保存代码,三来也不方便查看jar包的功能。
其实对于这种比较灵活的功能,最方便高效的做法是采用一些脚本语言,比如python,ruby等等,开发效率高,而且也能处理一些复杂逻辑。但是由于种种原因,工作中有的机器没有安装这些语言的解释器。因此不得已,研究了一波用shell脚本解析xml的方法。
说到底,shell还是不太适合处理复杂的逻辑,但是对于一些简单的查找替换等需求,用shell来搞还是挺方便的。
我这里主要采用了下面三个工具:
xmllint xpath xml2下面就分别总结下这三个工具的用法,方便以后查阅。
xmllint
简述
xmllint其实是由一个叫libxml2的c语言库函数实现的一个小工具,因此效率比较高,对不同系统的支持度也很好,功能也比较全。他一般属于libxml2-utils这个软件包,因此类似与sudo apt install libxml2-utils的命令就可以安装。
功能
xmllint至少支持下面几个常用功能:
支持xpath查询语句 支持类shell的交互式查询 支持xml格式验证 支持dtd,xsd对xml的校验 支持编码转换 支持xml格式化 支持去空格压缩 支持时间效率统计其实我们比较常用的功能主要也就是三个–xpath查询、去空格和格式化、校验。
比如当前有sample.xml:
<books>
<book id="1">
<name>book1</name>
<price>100</price>
</book>
<book id="2">
<name>book2</name>
<price>200</price>
</book>
<book id="3"><name>book3</name><price>300</price>
</book>
</books>
执行xpath查询:
myths@business:~$ xmllint --xpath "//book[@id=2]/name/text()" sample.xml book2
去空格:
myths@business:~$ xmllint --noblanks sample.xml <?xml version="1.0"?> <books><book id="1"><name>book1</name><price>100</price><license/></book><book id="2"><name>book2</name><price>200</price></book><book id="3"><name>book3</name><price>300</price></book></books>
格式化:
myths@business:~$ xmllint --format sample.xml <?xml version="1.0"?> <books> <book id="1"> <name>book1</name> <price>100</price> <license/> </book> <book id="2"> <name>book2</name> <price>200</price> </book> <book id="3"> <name>book3</name> <price>300</price> </book> </books>










