2014-11-18 2 views
0

У меня есть xml в местоположении «http://10.xxx.xxx.xx:8080/mbci/collection1/dataimport?command=status», которые имеют XML-данные в формате.Получите значение от xml на лету в сценарии оболочки

<response> 
    <lst name="responseHeader"> 
     <int name="status"> 
      0 
     </int> 
     <int name="QTime"> 
      0 
     </int> 
    </lst> 
    <lst name="initArgs"> 
     <lst name="defaults"> 
      <str name="config"> 
       data-config.xml 
      </str> 
     </lst> 
    </lst> 
    <str name="command"> 
     status 
    </str> 
    <str name="status"> 
     idle 
    </str> 
    <str name="importResponse"> 
     A command is still running... 
    </str> 
    <lst name="statusMessages"> 
     <str name="Time Elapsed"> 
      0:2:13.132 
     </str> 
     <str name="Total Requests made to DataSource"> 
      6 
     </str> 
     <str name="Total Rows Fetched"> 
      755949 
     </str> 
     <str name="Total Documents Skipped"> 
      0 
     </str> 
     <str name="Full Dump Started"> 
      2014-11-18 04:00:18 
     </str> 
    </lst> 
    <str name="WARNING"> 
     This response format is experimental. It is likely to change in the future. 
    </str> 
</response> 

Я должен получить от него значение. я не могу в состоянии найти прямой способ сделать это так, я Dowload файл, а затем разобрать XML-файл с помощью следующего сценария

wget http://10.xxx.xxx.xx:8080/mbci/collection1/dataimport?command=status -O status.xml 
status=$(grep -oP '(?<="status">).*(?=</str)' status.xml) 

Но мне нужно знать, есть ли другой более простой способ сделать это, а не загружать и parse

ответ

1

, безусловно, не является хорошим инструментом для запроса документа . Вместо этого используйте правильный xml parser.

В , есть 2 хорошие инструменты для такого рода задач, xmllint и xmlstarlet, вы будете иметь возможность запросить документ с помощью выражений. Это путь!

Пример:

$ xmllint --xpath '//str[@name="importResponse"]/text()' file 

    A command is still running... 
+0

будет эта работа для переменной вместо файла? –

+0

Да: '$ echo" $ var "| xmllint --xpath '// str [@ name = "importResponse"]/text()'/dev/stdin' ' –

+0

Спасибо @sputnick его работе. Еще одно уточнение - можно ли присвоить выход переменной ?. К сожалению, для прослушивания я новичок в shell-скриптах –

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