2016-03-21 5 views
0


Мне нужно разобрать данный XML-файл для определенного содержимого. К сожалению, у меня есть только xmllint WITHOUT xpath в моей системе (и мне не разрешено устанавливать/обновлять любые другие источники). XML, будет содержать:Анализ синтаксиса в bash

<?xml version="1.0"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
    <CreateIncidentResponse xmlns="http://schemas.hp.com/SM/7" xmlns:cmn="http://schemas.hp.com/SM/7/Common" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" message="Success" returnCode="0" schemaRevisionDate="2016-02-16" schemaRevisionLevel="2" status="SUCCESS" xsi:schemaLocation="http://schemas.hp.com/SM/7 /Incident.xsd"> 
     <model> 
     <keys> 
      <IncidentID type="String">IM0832268</IncidentID> 
     </keys> 
     <instance recordid="IM0832268 - Paul test 3 incident via soap" uniquequery="number=&quot;IM0832268&quot;"> 
      <IncidentID type="String">IM0832268</IncidentID> 
      <Category type="String">request for change</Category> 
      <OpenTime type="DateTime">2016-03-18T16:06:28+00:00</OpenTime> 
      <OpenedBy type="String">Harlass, Alexander</OpenedBy> 
      <Priority type="String">4</Priority> 
      <Urgency type="String">medium</Urgency> 
      <UpdatedTime type="DateTime">2016-03-18T16:06:28+00:00</UpdatedTime> 
      <AssignmentGroup type="String">TS3-AOS</AssignmentGroup> 
      <Description type="Array"> 
      <Description type="String">RH test incident description via soap row 1</Description> 
      <Description type="String">RH test incident description via soap row 2</Description> 
      </Description> 
      <Contact type="String">Harlass, Rudolf</Contact> 
      <Title type="String">Paul test 3 incident via soap</Title> 
      <TicketOwner type="String">INTEGRATION.OVO</TicketOwner> 
      <UpdatedBy type="String">INTEGRATION.OVO</UpdatedBy> 
      <Status type="String">Open</Status> 
      <Area type="String">it products</Area> 
      <Subarea type="String">utilization</Subarea> 
      <ProblemType type="String">request for change</ProblemType> 
      <Impact type="String">low</Impact> 
      <Service type="String">PI Automation and Orchestration Service</Service> 
      <VIP type="Boolean">false</VIP> 
      <TargetResolutionDate type="DateTime">2016-03-25T15:00:00+00:00</TargetResolutionDate> 
      <SOD type="String">OML</SOD> 
      <SourceId type="String">4711</SourceId> 
      <UserIncident type="Boolean">false</UserIncident> 
      <AlertId type="String">4712</AlertId> 
      <MonitoredId type="String">MI4713</MonitoredId> 
     </instance> 
     </model> 
     <messages> 
     <cmn:message type="String">Audit Record successfully recorded and added.</cmn:message> 
     </messages> 
    </CreateIncidentResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

В конце концов я должен был бы выход, как это:

Create SUCCESS 
Messages: 
    Audit Record successfully recorded and added. 
Incident ID: IM0832268 
    Status: Open 
    Severity: 4 
    Brief Description: RH test incident description via soap row 1 
    Opened by: integration.ovo 
    Opened time: March 20, 2016 11:54:08 PM CET 

Я знаю, как создать строку, содержащую выход, но, к сожалению, я не то, что знакомы с sed или аналогичными инструментами.
Любая помощь по извлечению необходимых строк из xml будет оценена по достоинству.
Заранее спасибо

+0

У вас есть [xsltproc] (http://xmlsoft.org/XSLT/xsltproc.html) в вашей системе? – Tomalak

+0

К сожалению, не – user3322838

+0

(Следуйте этому комментарию, если вам нужен быстрый взлом. Это не долгосрочное решение.) Даже если вы ничего не можете установить, вы обычно можете скомпилировать и скопировать двоичные (& зависимости) в эту систему на путь, на который у вас есть разрешение на запись. Худший случай, '/ tmp' - чтение-запись. Вы можете попробовать скопировать новую версию 'xmllint' в этот путь и выполнить ее оттуда. – anishsane

ответ

1

Большинство систем содержат python или perl или какой-либо другой язык, который имеет реальные возможности обработки XML. Это дало бы гораздо лучшее решение, пытающееся создать хорошо отформатированный отчет из большого фрагмента XML в bash. Сказав это, вот некоторые идеи для извлечения этих данных с помощью bash.

Учитывая строку, как:

<IncidentID type="String">IM0832268</IncidentID> 

Вы можете получить значение с помощью awk как это (при условии, что ваши данные в файле с именем data.xml):

awk -F'[<>]' '/IncidentID/ {print $3}' data.xml 

TjE -F'[<>]' устанавливает awk поле разделитель должен быть либо <, либо >, так что данная линия разделяется в таких полях:

| 1 | 2      | 3  | 4  | 5 | 
| |IncidentID type="String"|IM0832268|/IncidentID| | 

Приведенный выше пример будет на самом деле вернуть две строки (потому что есть два IncidentID теги в данных):

IM0832268 
IM0832268 

Если вы знаете, они всегда будут такими же, вы можете просто взять первый:

awk -F'[<>]' '/IncidentID/ {print $3; exit}' data.xml 

Чтобы извлечь атрибут из строки, как:

<CreateIncidentResponse xmlns="http://schemas.hp.com/SM/7" xmlns:cmn="http://schemas.hp.com/SM/7/Common" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" message="Success" returnCode="0" schemaRevisionDate="2016-02-16" schemaRevisionLevel="2" status="SUCCESS" xsi:schemaLocation="http://schemas.hp.com/SM/7 /Incident.xsd"> 

Вы можете сначала разбить его на одну строку в атрибут, например:

grep '<CreateIncidentResponse' data.xml | tr ' ' '\n' 

Который даст вам:

<CreateIncidentResponse 
xmlns="http://schemas.hp.com/SM/7" 
xmlns:cmn="http://schemas.hp.com/SM/7/Common" 
xmlns:xmime="http://www.w3.org/2005/05/xmlmime" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
message="Success" 
returnCode="0" 
schemaRevisionDate="2016-02-16" 
schemaRevisionLevel="2" 
status="SUCCESS" 
xsi:schemaLocation="http://schemas.hp.com/SM/7 
/Incident.xsd"> 

Что вы можете затем перейти к awk для извлечения значений атрибутов. Для Например, чтобы получить значение атрибута message:

grep '<CreateIncidentResponse' data.xml | tr ' ' '\n' | 
awk -F'"' '/message/ {print $2}' 

Какой бы выход:

Success 

Надеюсь, этого достаточно, чтобы вы начали.

+0

+1 для первого абзаца, но -1 для подрыва правильного первого абзаца с хрупким взломом, представленным в остальной части вашего ответа. – kjhughes

+0

«хрупкий взлом», мне это нравится. Думаю, мне нужно заказать футболку. – larsks

+1

:-) Могу ли я предложить: «Мои хрупкие хаки более надежны, чем ваш производственный код». – kjhughes

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