从xml获取属性名称

时间:2016-07-07 10:35:12

标签: bash unix grep xmllint

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

但是那个命令只打印首次出现 - 测试。

3 个答案:

答案 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;'
相关问题