2016-07-07 2 views
0

から属性名を取得します。I bashを使用して、たとえば、以下のXMLをフィルタリングしたいXML

問題:サブノードATT = "T" のattributが存在する場合 、attribut名は印刷する必要があります。

入力:

<?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> 

出力:

test 
test4 

私はgrepのとxmllintによって試みたが、成功しませんでした。

私の「一時的な」解決策は以下のとおりです。

xmllint --xpath 'string(//general/node1/subnode[@att2="t"]/@name)' file.xml 

しかし、そのコマンドの印刷のみ最初に出現した - テスト。

答えて

0

あなたが尋ねたものではありませんが、どちらもシステムですぐに利用できるはずです(たとえば、両方ともほとんどのディストリビューションでパッケージマネージャー経由で利用できるはずです - XML::Twigcpan経由でダウンロードできます)。あなたは1つのライナーとして)

#!/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"]})' 

この1つのライナーはAWK/SED/grepの例と同じように使用することができますxmlをパイプする場所として、またはコマンドラインで指定されたファイルとして指定します。

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 
+0

は時々別の属性を印刷し、動作していません。私は修正することができるように – profiler

+0

私は非作業例のためのXMLコンテンツを必要としています。いくつかのケースで質問を更新してください。また、私のコードを使用すると、ATT [any_number] =「t」を含む行をマッチさせたい前提としています。そうじゃないの? att2 = "t"と一致する必要がありますか? –

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;' 
+0

xmlstarletは、標準のコマンドではありません...最善の解決策は、xmllintを使用することになります。あなたはそれがあなたの** **システムではありません意味していることで – profiler

+1

。 –

+0

はい、確かに。私はLinux上にあるコマンドを使用したいと思います。 – profiler

関連する問題