我想使用bash过滤xml下面的示例。
问题: 如果属于子节点att =" t"存在,属性名称应该打印。
输入:
$("#datePicker").datePicker({startDate: new Date() });
输出:
<?xml version="1.0" encoding="UTF-8"?>
<general>
<node1>
<subnode att1="a" att2="t" name="test"> </subnode>
<subnode att1="a" name="test2"> </subnode>
<subnode att1="a" name="test3"> </subnode>
<subnode att1="a" att2="t" name="test4"> </subnode>
</node1>
</general>
我试过grep和xmllint,但没有成功。
我的&#34;临时&#34;解决方案是:
test
test4
但是那个命令只打印首次出现 - 测试。
答案 0 :(得分:0)
不完全是你提出的要求,但是使用perl(和XML解析器),这两者都应该在您的系统上随时可用:(例如,两者都应该通过大多数发行版中的包管理器提供 - XML::Twig
也可以如果您愿意,可以通过cpan
下载
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->parse( \*DATA );
print $_->att('name'),"\n" for $twig->get_xpath('//subnode[@att2="t"]');
__DATA__
<?xml version="1.0" encoding="UTF-8"?>
<general>
<node1>
<subnode att1="a" att2="t" name="test"> </subnode>
<subnode att1="a" name="test2"> </subnode>
<subnode att1="a" name="test3"> </subnode>
<subnode att1="a" att2="t" name="test4"> </subnode>
</node1>
</general>
作为一个班轮,这变为:
perl -0777 -MXML::Twig -e 'print $_->att("name"),"\n" for XML::Twig->parse(<>)->get_xpath(q{//subnode[@att2="t"]})'
这一个衬垫可以与awk / sed / grep相同的方式使用,例如作为管道xml的地方,或者在命令行上指定的文件。
答案 1 :(得分:0)
请检查一下是否有效
awk '{if(/att[0-9]="t"/){line=$0;replacedLine=substr(line,index(line,"name="));gsub(/name="/,"",replacedLine);endIndex=index(replacedLine,"\"");print substr(replacedLine,0,endIndex);}}' xmlfile
答案 2 :(得分:0)
使用xmlstarlet
:
xmlstarlet sel -t -v '//general/node1/subnode[@att2="t"]/@name' -nl
如果您必须使用xmllint
,请执行以下操作:
xmllint --xpath '//general/node1/subnode[@att2="t"]/@name' sample.xml \
| sed 's/ name="//g; s/"/\n/g;'