XML

2017-02-17 2 views
0

に親タグの属性を取得し、私はXMLのこの小さな作品を持っている:XML

<tile x="764" y="491" z="7"> 
    <item id="1988"/> 
    <inside> 
     <item id="3972"/> 
    </inside> 
</tile> 
<tile x="764" y="492" z="7"> 
    <item id="2343"/> 
</tile> 
<tile x="764" y="491" z="7"> 
    <item id="2000"/> 
    <inside> 
     <item id="3972" special_description="whatever"/> 
    </inside> 
</tile> 
<tile x="765" y="491" z="7"> 
    <item id="2114"/> 
</tile> 
<tile x="764" y="491" z="7"> 
    <item id="1988"/> 
</tile> 

私は項目タグの特定の属性のための検索に基づいてタイル属性の詳細を取得したいと思います。例えば、私が3972を探すとしたら、私はこのような何かの結果を得るでしょう:

x="764" y="491" z="7" : id="3972" 
x="764" y="491" z="7" : id="3972" special_description="whatever" 

することは明らかに結果が言葉で表現されているかを正確に限り、私は唯一の私は詳細を持っているように本当に重要ではありません[[item]]に[[id = "3972"]]があれば[[tile]]タグの属性であり、その[[item]]の属性も表示し、他のタイル。

私はXMLStarletで私の運を尽くしましたが、これまでのところ、手がかりはありませんでしたか?

+1

あなたは私たちにXMLStarletの試行を表示できますか? –

+0

私は基本的な機能ではほとんど演奏していましたが、現時点ではわかりません。 –

答えて

0

楽しみのためだけに、あなたはこの1に試してみることができます。

$ term="2114";awk -v term=$term '{a[NR]=$0; if ($0 ~ term) \ 
{i=NR;while (a[i] !~ "<tile x=.+ y=.+ z=.+") i--; \ 
print gensub(/(<tile) (.+)(>)/,"\\2","g",a[i]),":", \ 
gensub(/([ ]*)(<item)(.+)(\/>)/,"\\3","g",$0)}} ' file5 

Offcourseデータのようなもののために適切なパーサの使用はあなたの最初の選択肢でなければなりません。一方、上記はOKです(あなたのアドバイスされたすべてのデータでテスト済み)。

0

@Thisガイ:試してみてください:

awk '/<tile/{A=1} /<\/tile>/{A="";if(VAL ~ /3972/){print VAL;};VAL=""} /<\/inside/{B=""} /<inside/{B=1} A{gsub(/tile |>|<|\/|inside/,"");if(B){sub(/item id/,": id")};if(!B){gsub(/item id=.*|^[[:space:]]+/,"")};VAL=VAL?VAL OFS $0:$0}' Input_file 

はNON-1あまりにも次のように解決のライナーフォーム。

awk '/<tile/{ 
       A=1 
      } 
    /<\/tile>/{ 
       A=""; 
       if(VAL ~ /3972/){ 
             print VAL; 
           }; 
       VAL="" 
       } 
    /<\/inside/{ 
         B="" 
       } 
    /<inside/{ 
       B=1 
       } 
    A{ 
     gsub(/tile |>|<|\/|inside/,""); 
     if(B){ 
       sub(/item id/,": id") 
      }; 
     if(!B){ 
       gsub(/item id=.*|^[[:space:]]+/,"") 
       }; 
     VAL=VAL?VAL OFS $0:$0 
     } 
    ' Input_file 

出力は以下の通りです。

x="764" y="491" z="7"    : id="3972" 
x="764" y="491" z="7"    : id="3972" special_description="whatever"