2017-02-17 19 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" 

Очевидно, как именно результаты сформулированы на самом деле не важно, как долго, как я только детали я который является атрибутом тега [[tile]], если в нем есть [[item]] с [[id = "3972"]] и также отображать атрибуты этого [[item]] и пропустить другие плитки.

Я пробовал свою удачу с XMLStarlet, но мне пока не повезло, никаких подсказок?

+1

Вы можете показать нам попытки XMLStarlet? –

+0

Я играл в основном с основными функциями, которые сейчас не могу сказать, оставил мою машину на работе. –

ответ

0

Просто для удовольствия, вы можете дать попробовать на этот:

$ 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 использование правильного синтаксического анализатора для такого рода данных должен быть вашим первым выбором. Между тем, кажется, что выше работает нормально (проверено со всеми вашими данными).

0

@This Guy: Попытка:

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-один вкладыш формы раствора следующим образом тоже.

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" 

 Смежные вопросы

  • Нет связанных вопросов^_^