XML-Abfrage in Bash mit XMLStarlet

1246
gmark

Ich muss ein paar Werte aus einer XML-Datei extrahieren und bin auf XMLStarlet gestoßen, das ziemlich mächtig erscheint. Da ich wenig über XML weiß, bin ich mit dem Tool überfordert und brauche wahrscheinlich nur einen sehr kleinen Teil davon. Ich habe eine Datei wie die folgende und wollte folgende Adresse bekommen:

<es:ipAddress>123_Westbrook</es:ipAddress> 

Wie würde ich das eingeben?

Welche Bedeutung haben diese zusätzlichen Felder es? Ich gehe davon aus, dass dieses Objekt (der ipAddressWert 123 Westbrook) in Klammern steht, aber welcher Teil des Pfads wird tatsächlich an XMLStarlet übergeben ? Die Klammern? Der Parametername? Getrennt durch Schrägstriche?

Vielleicht:

xmlstarlet sel '<bulkCmConfigDataFile xmlns:gn="JOE.xsd"> < configDat dnPrefix="Undefined"> < xn:Subnetwork id="Oz"><xn:MeContext id="BANANS"><xn:attributes><es:vsDataMeContext><es:ipAddress> 

Was sollte auf den Wert verweisen 123_Westbrook? Schrägstriche einfügen? Etwas anderes?

Die Originaldatei ist sehr groß, daher hier der erste Teil der XML-Datei (viele der abschließenden Tags fehlen, wenn nur ein Teil davon veröffentlicht wird):

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <bulkCmConfigDataFile xmlns:un="utranNrm.xsd" 3 xmlns:es="FRED.99.88.xsd" 4 xmlns:xn="JIM.xsd" xmlns:gn="JOE.xsd" xmlns="CARL.xsd"> 5 <fileHeader fileFormatVersion="THE_GOOD_OND" vendorName="Mr. Softie"/> 6 <configData dnPrefix="Undefined"> 7 <xn:SubNetwork id="ROOM_4_MORE"> 8 <xn:SubNetwork id="Oz"> 9 <xn:attributes> 10 <xn:userDefinedNetworkType>SECRET_SERVICE</xn:userDefinedNetworkType>  11 <xn:userLabel>OZ</xn:userLabel> 12 </xn:attributes> 13 <xn:MeContext id="BANANAS"> 14 <xn:VsDataContainer id="BANANAS"> 15 <xn:attributes>  16 <xn:vsDataType>SECRET_SQUIRREL</xn:vsDataType> 17 <xn:vsDataFormatVersion>GOOD_HUMOR</xn:vsDataFormatVersion>  18 <es:vsDataMeContext> 19 <es:userLabel>ORANGE</es:userLabel> 20 <es:ipAddress>123_Westbrook</es:ipAddress> 21 <es:neMIMversion>S-11</es:neMIMversion> 22 <es:lostSynchronisation>SYNCHRONISED</es:lostSynchronisation>  23 <es:bcrLastChange>LAST_DATE</es:bcrLastChange> 24 <es:bctLastChange>LAST_DATE</es:bctLastChange> 25 <es:multiStandardRbs6k>uh-uh</es:multiStandardRbs6k> 
0

2 Antworten auf die Frage

0
g2mk

Welche Bedeutung haben diese zusätzlichen Felder es?

esbedeutet, dass es ipAddressaus dem FRED.99.88.xsdXML-Schema kommt - sehen Sie sich die xmlns:es="FRED.99.88.xsd"Namensraumdefinition an (eines der bulkCmConfigDataFileRoot-Tag-Attribute)


Ich gehe davon aus, dass dieses bestimmte Objekt (der ipAddress-Wert, 123 Westbrook) in Klammern steht, aber welcher Teil des Pfads wird tatsächlich an XMLStarlet übergeben?

Laut XMLStarlet- Dokumentation :

sel (oder select) - Daten auswählen oder XML-Dokument (e) abfragen (XPATH usw.)

und danach xmlstarlet sel --help:

XMLStarlet Toolkit: Select from XML document(s) Usage: xmlstarlet sel <global-options> {<template>} [ <xml-file> ... ] where <global-options> - global options for selecting <xml-file> - input XML document file name/uri (stdin is used if missing) <template> - template for querying XML document with following syntax:  <global-options> are: -Q or --quiet - do not write anything to standard output. -C or --comp - display generated XSLT -R or --root - print root element <xsl-select> -T or --text - output is text (default is XML) -I or --indent - indent output -D or --xml-decl - do not omit xml declaration line -B or --noblanks - remove insignificant spaces from XML tree -E or --encode <encoding> - output in the given encoding (utf-8, unicode...) -N <name>=<value> - predefine namespaces (name without 'xmlns:') ex: xsql=urn:oracle-xsql Multiple -N options are allowed. --net - allow fetch DTDs or entities over network --help - display help  Syntax for templates: -t|--template <options> where <options> -c or --copy-of <xpath> - print copy of XPATH expression -v or --value-of <xpath> - print value of XPATH expression -o or --output <string> - output string literal -n or --nl - print new line -f or --inp-name - print input file name (or URL) -m or --match <xpath> - match XPATH expression --var <name> <value> --break or --var <name>=<value> - declare a variable (referenced by $name) -i or --if <test-xpath> - check condition <xsl:if test="test-xpath"> --elif <test-xpath> - check condition if previous conditions failed --else - check if previous conditions failed -e or --elem <name> - print out element <xsl:element name="name"> -a or --attr <name> - add attribute <xsl:attribute name="name"> -b or --break - break nesting -s or --sort op xpath - sort in order (used after -m) where op is X:Y:Z,  X is A - for order="ascending" X is D - for order="descending" Y is N - for data-type="numeric" Y is T - for data-type="text" Z is U - for case-order="upper-first" Z is L - for case-order="lower-first" ...  

Sie können XPath verwenden, um das XML-Dateielement hier auszuwählen.


Welcher sollte auf den Wert 123_Westbrook verweisen? Schrägstriche einfügen? Etwas anderes?

Da mir Ihre Frage als eine Art Hausaufgabe erscheint, gebe ich Ihnen nur:

  • XMLStarlet-Syntax-Tipp:
    xmlstarlet sel -t <template option> <XPath to es:ipAddress tag> -n <filename.xml>
    Verwenden Sie Vorlagenoptionen, die Folgendes enthalten XPATH.
  • XPath- Beispiele und Sandbox
0
PBI

To get the value of that element "es:ipAddress" with xmlstarlet:

xmlstarlet sel -t -v '//es:ipAddress' thefilename.xml 

which prints: "123_Westbrook".