Linux Shell | 解析xml节点

01 xml文件

# user.xml
<user>
    <name>Toy</name>
    <sex>man</sex>
    <room/>
</user>

其中第 5 行的<room/> xml 节点是空节点,是比较特殊的格式。


02 多条命令解析xml节点

采用多条命令和管道符也可以解析xml节点,方式如下:

[~]$ cat user.xml | grep name | sed 's/^.*<name>//g' | sed 's/<\/name>.*$//g'
Toy
[~]$ cat user.xml | grep name | sed 's/^.*<sex>//g' | sed 's/<\/sex>.*$//g'

[~]$ cat user.xml | grep room | sed 's/^.*<room>//g' | sed 's/<\/room>.*$//g'
    <room/>

上面的方式无法解析 <room/> 这种特殊格式的 xml 节点,虽然用多个命令和管道符是可以实现解析正常格式的xml节点的值,但是过多的管道符是会降低执行效率的。

因为管道符是会为连接的命令产生子进程,从而加大CPU的开销。


03 一行 awk 命令解析xml节点

awk 命令解析所有特殊的 xml 节点的值,只需要一行命:

[~]$ awk  '/<\/*name\/*>/{gsub(/[[:space:]]*<\/*name\/*>/,"");print $0}' user.xml
Toy
[~]$ awk  '/<\/*sex\/*>/{gsub(/[[:space:]]*<\/*sex\/*>/,"");print $0}' user.xml
man
[~]$ awk  '/<\/*room\/*>/{gsub(/[[:space:]]*<\/*room\/*>/,"");print $0}' user.xml 

[~]$

上面的 awk 方式可以兼容所有特殊的 xml 节点,并且只需要一条命令就能解析出 xml 的值。

简单说明下命令的意思:

  • awk ‘/匹配的字符串/{print $0}‘表示在文本中,找到匹配的字符串所在的行记录,可以替代grep "匹配的字符串"
  • gsub(/匹配的字符串/,"")是 awk 内部的函数,表示将匹配到的字符串替换成"",也就是替换成空字符串,可以替代 sed ‘s/匹配的字符串//g‘
  • </*name/*> 中的 * 号是正则表达式,*号表示可以重复前面字符 0 个或多个,所以</*name/*> 可以间接的表示<name></name><name/>
  • [[:space:]] 表示匹配空格、制表格等空白符,[[:space:]]*表示匹配空白字符0个或多个
  • $0 表示取记录的所有记录

所以,awk 解析 xml 节点的命令小结成如下:

awk  '/<\/*节点名字\/*>/{gsub(/[[:space:]]*<\/*节点名字\/*>/,"");print $0}' xml文件

04 小结

我们在编写脚本时,需要解析文本文件时,尽量避免使用多命令和管道符的方式去解析,因为使用了管道符就会产生子进程,会加大了 CPU 的开销。

大部分情况下只需要一条 awk 命令就完成解析的工作,相比较起多命令和管道符的方式效率会更高,并且CPU开销小。

通过以上的两个解析xml节点的案例,我们可以总结出:

awk '/匹配的字符串/{print $0}' 可以替代 grep "匹配的字符串"
awk  '{gsub(/匹配的字符串/,"");print $0}' 可以替代 sed 's/匹配的字符串/""/g'

awk '/匹配的字符串/{gsub(/匹配的字符串/,"");print $0}' <xml文件>
可以替代
cat <xml文件> | grep "匹配的字符串" | sed 's/匹配的字符串/""/g'

原文地址:https://www.cnblogs.com/xiaolincoding/p/11854011.html

时间: 2024-11-08 04:18:52

Linux Shell | 解析xml节点的相关文章

shell解析xml文件

centos安装xml2 yum install xml2 测试文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment> PowerEngine Main Configuration &l

Oracle解析XML 节点信息并转换String 类型

select   xmltype(dataxml).extract('/data/sqr_mc/text()').getstringval()  as sqrmc from t_ins_formdata where bsnum='170215085821005401' 原文地址:https://www.cnblogs.com/auldlangsynezh/p/8178196.html

[C#]记一次解析XML转对象的笔记

项目中调用第三方API,返回格式是XML字符串,需要将XML反序列化为对象,格式如下: 1 <?xml version="1.0"?> 2 <Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" totalCount="123" resultCode

java解析xml的三种方法

java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; // public class Saxhandler extends DefaultHandler { @Override public void startDocument() throws

Java解析XML三种常用方法

1.使用DOM方式解析: 1 package com.wzh.dom; 3 import java.util.Iterator; 5 import javax.xml.parsers.DocumentBuilder; 6 import javax.xml.parsers.DocumentBuilderFactory; 8 import org.w3c.dom.Document; 9 import org.w3c.dom.Element; 10 import org.w3c.dom.NamedNo

解析xml文件,遍历输出xml文件中的所有节点, 最终模仿实现struts2框架

程序结构:src文件夹下存放xml文件 该文件内容: <?xml version="1.0" encoding="UTF-8"?> <mystruts> <actions name="myaction1" namespace="/"> <action name="userdao" class="org.action.UserDAO"> &l

SAX解析xml (遍历DOM树各节点)

本文参考 http://yangjunfeng.iteye.com/blog/401377 1. books.xml 1 <?xml version="1.0" encoding="UTF-8"?> 2 <bk:books count="3" xmlns:bk="http://test.org/books"> 3 <!--books's comment --> 4 <bk:book i

用DOM解析XML ,用xpath快速查询XML节点

XPath是一种快速查询xml节点和属性的一种语言,Xpath和xml的关系就像是sql语句和数据库的关系.用sql语句可以从数据库中快速查询出东西同样的用xPath也可以快速的从xml中查询出东西. 下面的示例演示了怎么用jdk自带的rt.jar完成dom解析 代码如下: test.xml的代码如下: <?xml version="1.0" encoding="UTF-8" ?> <inventory> <book year=&quo

解析xml文件 selectSingleNode取不到节点(转)

解析xml文件 selectSingleNode取不到节点 2013年02月25日 21:43:39 knight0513 阅读数:1767 在解析xml文件的时候按照原来的方法使用selectSingleNode取不到节点.xml代码如下: <?xml version="1.0" encoding="UTF-8"?> <CwapMessage xmlns="http://wap.homeinns.com/cwap"> &