2016-03-21 6 views
0


Ich muss eine bestimmte XML-Datei für bestimmte Inhalte analysieren. Leider habe ich nur xmllint OHNE xpath auf meinem System (und ich darf keine anderen Quellen installieren/aktualisieren). Die XML enthalten würden:Parsing xml in 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> 

Am Ende würde ich eine Ausgabe wie diese benötigt:

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 

weiß ich, wie eine Zeichenfolge zu erstellen, die Ausgabe enthält, aber leider bin ich nicht, dass vertraut mit sed oder ähnlichen Werkzeugen.
Jede Hilfe, wie die benötigten Zeichenfolgen aus dem XML extrahiert werden, wäre willkommen.
Vielen Dank im Voraus

+0

Haben Sie [xsltproc] (http://xmlsoft.org/XSLT/xsltproc.html) auf Ihrem System? – Tomalak

+0

leider nicht – user3322838

+0

(Folgen Sie diesem Kommentar, wenn Sie einen schnellen Hack benötigen. Dies ist keine langfristige Lösung.) Obwohl Sie nichts installieren können, können Sie in der Regel die Binärdatei (& Abhängigkeiten) zu diesem System kompilieren und kopieren Pfad, zu dem Sie Schreibberechtigung haben. Im schlimmsten Fall ist '/ tmp' lesend/schreibend. Sie können versuchen, die neue Version von 'xmllint' in diesen Pfad zu kopieren und von dort auszuführen. – anishsane

Antwort

1

Die meisten Systeme enthalten python oder perl oder eine andere Sprache, die tatsächlichen XML-Verarbeitungsfunktionen verfügt. Dies würde zu einer weitaus besseren Lösung führen als der Versuch, einen schön formatierten Bericht aus einem großen Stück XML in bash zu erstellen. Nachdem dies gesagt wurde, hier sind einige Ideen zum Extrahieren dieser Daten mit bash.

eine Zeichenfolge wie Gegeben:

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

Sie den Wert bekommen kann awk wie folgt aus (vorausgesetzt, Ihre Daten in einer Datei mit dem Namen ist data.xml):

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

Tje -F'[<>]' setzt das awk Feld Trennzeichen entweder < oder >, so dass die angegebene Zeile in Felder wie folgt aufgeteilt wird:

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

Das obige Beispiel wird tatsächlich zwei Linien zurückkehren (weil es in Ihren Daten zwei IncidentID Tags ist):

IM0832268 
IM0832268 

Wenn Sie diese wissen immer gleich sein, können Sie nur die ersten nehmen:

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

Um ein Attribut von einer Linie zu extrahieren, wie:

<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"> 

können Sie spalten zuerst in eine Zeile pro Attribut, wie folgt aus:

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

die Ihnen:

<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"> 

, die Sie dann zu awk passieren können Attributwerte zu extrahieren. Für Beispiel den Wert des message Attribut zu erhalten:

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

Welche ergeben würde:

Success 

Hoffentlich genug, um Ihnen den Start.

+0

+1 für den ersten Absatz, aber -1 für die Untergrabung des korrekten ersten Absatzes mit dem spröden Hack im Rest Ihrer Antwort. – kjhughes

+0

"spröder hack", das mag ich. Ich denke, ich muss ein T-Shirt bestellen. – larsks

+1

:-) Darf ich vorschlagen: "Meine spröden Hacks sind robuster als Ihr Produktionscode." – kjhughes