用于分析xml的shell命令运行不正常

用于分析xml的shell命令运行不正常,xml,linux,bash,shell,terminal,Xml,Linux,Bash,Shell,Terminal,我想解析下面的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="tr

我想解析下面的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>
但是我得到的结果是

-------
14
预计产量为

14

有人能告诉我我犯了什么错误吗?

使用
--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

这会过滤掉以
/>
(如您尝试的那样)或
-
开头的任何行,因此其他不需要的行也会被删除。

xmllint有一个选项
--xpath
来计算xpath表达式

例如,您可以执行以下操作:

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

只想得到
14

哇,你实际上是在为工作使用正确的工具,而不是绝大多数类似的问题!您能解释一下xpath和shell之间的区别吗。grep命令在这里做什么。
 xmllint --xpath '//*[local-name()="apptype"]/text()' your.xml