
本文总结并介绍了使用Shell解析和处理XML的方法,并介绍了xmlint,xpath和xml2这三种工具的使用. 本文将详细介绍示例代码. 需要它的朋友可以参考它. 作为参考,让我们与编辑器一起学习.
前言
几天前,当我在工作时,我遇到了解析和处理xml文件的需求. 当时,考虑到逻辑更加复杂解析xml,我慢慢地参与其中. 但是,此要求经常更改,并且每次更改后必须再次找到jar包的代码. 更改后,必须更换原始的jar包装. 修改不方便,统一保存代码不方便,查看jar包的功能也不方便.
实际上,对于这种更灵活的功能,最方便,最有效的方法是使用某些脚本语言,例如python,ruby等,它们具有很高的开发效率并且还可以处理一些复杂的逻辑. 但是,由于各种原因,某些工作中的计算机未安装使用这些语言的解释器. 因此,我们必须研究一种使用shell脚本解析xml的方法.
归根结底,shell仍然不适合处理复杂的逻辑,但是对于某些简单的搜索和替换需求,使用shell进行操作非常方便.
我主要在这里使用以下三个工具:
下面分别总结了这三个工具的用法,以供将来参考.
xmllint
摘要
xmllint实际上是由称为libxml2的库函数实现的小型工具,因此效率相对较高,对不同系统的支持也非常好,并且功能也相对完善. 他通常属于libxml2-utils软件包,因此可以安装类似于sudo apt install libxml2-utils的命令.

功能
xmllint至少支持以下常用功能:
实际上,最常用的功能主要是三路径查询,空间删除和格式化以及验证.
例如,当前有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>
XSD验证:
myths@business:~$ cat sample.xsd
<xml version="1.0" encoding="utf-8">
<xs:schema id="books" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="books" msdata:IsDataSet="true" msdata:Locale="en-US">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" minOccurs="0" msdata:Ordinal="0" />
<xs:element name="price" type="xs:string" minOccurs="0" msdata:Ordinal="1" />
</xs:sequence>
<xs:attribute name="id" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
myths@business:~$ xmllint --noout --schema sample.xsd sample.xml
sample.xml validates
注意: 验证结果信息将输出到stderr. 默认情况下,该工具会将原始文件回显到stdout. 您可以添加–noout参数以关闭标准输出回声.
流式传输:
xmllint默认为传递文件名. 如果要通过管道传递文件流以传递数据,可以执行以下操作:
myths@business:~$ cat sample.xml |xmllint --format - <xml version="1.0"> <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>
xpath
摘要
xpath工具实际上是一个封装的perl脚本,它本身只有200行. 该功能更为具体,即它提供了xpath查询功能. 他通常属于libxml-xpath-perl软件包,因此可以安装类似于sudo apt install libxml-xpath-perl的命令. 像suse这样的系统也将直接与它们一起提供.

功能
安装在不同系统上的版本可能不同,但基本功能相似:
myths@business:~$ xpath -e '//book/name/text()' sample.xml Found 3 nodes in sample.xml: -- NODE -- book1 -- NODE -- book2 -- NODE -- book3
默认情况下,查询结果将输出到stdout,描述信息将输出到stderr. 如果方便收集结果,则可以将stderr重定向到/ dev / null,或添加-q参数:
myths@business:~$ xpath -e '//book/name/text()' sample.xml 2>/dev/null book1 book2 book3 myths@business:~$ xpath -q -e '//book/name/text()' sample.xml book1 book2 book3
与xmllint的xpath函数相比,xpath略有不同. 如果xpath与多个结果匹配,则xpath将在单独的行中输出,而xmllint将被摩擦成一行:
myths@business:~$ xmllint --xpath "//book/name/text()" sample.xml book1book2book3
xml2
摘要
知道xml2工具的人并不多,但实际上他可以在某些场景中与其他命令一起工作. 该工具开发人员的博客似乎已经挂断了,但是视觉检查应该是用C和libxml2库编写的一个小工具. 它通常在xml2软件包中,因此可以安装sudo apt install xml2之类的命令.

功能
此工具包含六个命令: xml2、2xml,html2、2html,csv2、2csv,该函数也非常统一,即转换xml,html,csv格式和他称为“纯格式”的格式. 例如:
myths@business:~$ cat sample.xml |xml2 /books/book/@id=1 /books/book/name=book1 /books/book/price=100 /books/book /books/book/@id=2 /books/book/name=book2 /books/book/price=200 /books/book /books/book/@id=3 /books/book/name=book3 /books/book/price=300 myths@business:~$ cat sample.xml |xml2|2xml <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>
这种自定义格式非常简单和巧妙,有的指示新节点(/ books / book),有的指示给节点分配值(/ books / book / name = book1)解析xml,有的指示给节点赋值的属性( /书籍/书籍/ @ id = 1). 编写与xpath非常相似,但不完全相同. 并且彼此对应的两个命令可以一起幂等.
那么此转换命令有什么用?实际上,我们经常会遇到创建xml文件的一些需求,但是直接根据xml格式动态生成非常麻烦. 目前,使用平面格式进行传输非常方便:
#!/usr/bin/env bash
tempFile=$(mktemp tmp.XXXX)
function addBook(){
id=$1
name=$2
price=$3
echo "/books/book">>$tempFile
echo "/books/book/@id=$id">>$tempFile
echo "/books/book/name=$name">>$tempFile
echo "/books/book/price=$price">>$tempFile
}
function main(){
addBook 1 book1 100
addBook 2 book2 200
addBook 3 book3 300
cat $tempFile|2xml|xmllint --format --output new_sample.xml -
rm $tempFile
}
main "$@"
上面的代码生成的new_sample.xml与sample.xml完全一样.
摘要
以上是本文的全部内容,希望本文的内容对大家的学习或工作具有一定的参考价值. 如有任何疑问,可以留言交流,谢谢支持.
本文标题: 使用Shell解析和处理XML的方法摘要
本文地址:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-214811-1.html
人家10多20年的东西拿出来照样用
既然在南海奈何不了他