2015-03-05 2 views
0

У меня есть эта xml-схема, не могли бы вы помочь мне извлечь значения всего элемента, используя XMLStarlet, в сценарии оболочки.XmlStarlet Querying XML

<transfer-matrix.xml> 
    <transfers> 
     <rows> 
      <item> 
       <item>Hungary</item> 
       <item>Kharkov-KIPT-LCG2</item> 
       <item>9882899680</item> 
       <item>4</item> 
       <item>1</item> 
      </item> 
      <item> 
       <item>Spain</item> 
       <item>Kharkov-KIPT-LCG2</item> 
       <item>32945102817</item> 
       <item>12</item> 
       <item>2</item> 
      </item> 
      <item> 
       <item>Finland</item> 
       <item>Kharkov-KIPT-LCG2</item> 
       <item>10737418240</item> 
       <item>4</item> 
       <item>0</item> 
      </item> 
      <item>...</item> 
      <item>...</item> 
      <item>...</item> 
     </rows> 
     <key>...</key> 
    </transfers> 
<params>...</params> 
</transfer-matrix.xml> 

Я пытаюсь извлечь элемент таким образом

outcome=`xml sel -T -t -m /transfer-matrix.xml/transfers/rows/item -s D:N:- "@item" -v "concat(@item,'|',item,'|',item,'|',item,'|',item,'|',item)" -n /usr/share/dashboard/xml/transfers-country.xml` 

Мой вывод:

|Hungary|Hungary|Hungary|Hungary|Hungary |Spain|Spain|Spain|Spain|Spain |Finland|Finland|Finland|Finland|Finland 

мне нужно отформатировать как этот

|Hungary|Kharkov-KIPT-LCG2|9882899680|4|1 
|Spain|Kharkov-KIPT-LCG2|32945102817|12|2 
|Finland|Kharkov-KIPT-LCG2|10737418240|4|0 

Я бы благодарен за помощь

ответ

0

Вы должны указать, какой элемент вы хотите, и добавить символ новой строки в конце концов, как это:

OUTPUT=$(xmlstarlet sel -T -t -m /transfer-matrix.xml/transfers/rows/item -s D:N:- "@item" -v "concat(@item,'|',item[1],'|',item[2],'|',item[3],'|',item[4],'|',item[5],'\n')" transfers-country.xml) 

И тогда вы можете получить желаемый результат с помощью echo -e:

$ echo -e "$OUTPUT" 
|Hungary|Kharkov-KIPT-LCG2|9882899680|4|1 
|Spain|Kharkov-KIPT-LCG2|32945102817|12|2 
|Finland|Kharkov-KIPT-LCG2|10737418240|4|0 

Edit: Как указывает npostavs, было бы гораздо лучше использовать флаг -n вместо:

$ xmlstarlet sel -T -t -m /transfer-matrix.xml/transfers/rows/item -s D:N:- "@item" -n -v "concat(@item,'|',item[1],'|',item[2],'|',item[3],'|',item[4],'|',item[5])" transfers-country.xml 

|Hungary|Kharkov-KIPT-LCG2|9882899680|4|1 
|Spain|Kharkov-KIPT-LCG2|32945102817|12|2 
|Finland|Kharkov-KIPT-LCG2|10737418240|4|0 
+0

Спасибо, много работает отлично! – Kim

+1

Вместо того чтобы помещать '\ n' в выражение' concat' (для интерпретации 'echo e'), вы можете использовать опцию' -n' xmlstarlet для вывода новой строки напрямую. – npostavs

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