【问题标题】:shell command to parse xml is not behaving properly解析 xml 的 shell 命令行为不正确
【发布时间】:2015-11-04 09:52:04
【问题描述】:

我想解析下面的xml

<?xml version="1.0" encoding="UTF-8"?>
  <widget xmlns="http://www.w3.org/ns/widgets" xmlns:tzn="http://tzn.org/ns/widgets" id="http://yourdomain/TznTtApp" version="1.0.0" viewmodes="maximized">
  <acs orgn="*" sbdomains="true"/>
  <tzn:application id="ca9i.TznTtApp" package="ca9i" required_version="1.0"/>
  <apptype>14</apptype>
  <content src="index.html"/>
  <feature name="http://tzn.org/fate/sn.se.al"/>
  <icon src="icon.png"/>
  <name>TznTtApp</name>
</widget>

所以我使用下面的shell脚本

echo -e 'cat //*[local-name()="apptype"]/text()' | xmllint --shell  /data/2211334455/894949890051_1.0.4/config.xml | grep -v "^/ >"

但我得到的输出像

-------
14

预期的输出是

14

谁能告诉我我做错了什么?

【问题讨论】:

  • 哇,您实际上使用了正确的工具来完成这项工作,而不是绝大多数类似的问题!

标签: xml linux bash shell terminal


【解决方案1】:

当您使用--shell 选项时,这似乎只是输出的一部分。一种选择是只使用--xpath:

$ xmllint --xpath '//*[local-name()="apptype"]/text()' config.xml
14

--shell 选项启动一个交互式 shell,您当前正在使用echo 向它传递命令。 --xpath 用于返回匹配 XPath 的结果。在这种情况下,这正是您想要的。

如果您有充分的理由使用--shell,我想您可以添加到您的 grep 过滤器中:

$ echo 'cat //*[local-name()="apptype"]/text()' | xmllint.exe --shell config.xml | grep -v '^\(/ >\| -\)'
14

这会过滤掉以/ &gt;(如您的尝试)或- 开头的所有行,因此也会删除其他不需要的行。

【讨论】:

  • 你能解释一下xpath和shell的区别吗? grep 命令在这里做什么。
【解决方案2】:

xmllint 有一个选项 --xpath 来评估 xpath 表达式。

对于您的示例,您可以这样做:

 xmllint --xpath '//*[local-name()="apptype"]/text()' your.xml

只获取14

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2013-07-12
    相关资源
    最近更新 更多