Frage XML-Abfrage in Bash mit XMLStarlet


Ich muss ein paar Werte aus einer XML-Datei extrahieren, und ich stolperte auf XMLStarlet das scheint ziemlich stark zu sein. Da ich wenig über XML weiß, bin ich überwältigt von dem Tool und brauche wahrscheinlich nur einen sehr kleinen Teil davon. Ich habe eine Datei wie die folgende und ich wollte sagen, die folgende Adresse:

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

Wie würde ich das tippen?

Welche Bedeutung haben diese zusätzlichen Felder? es? Ich gehe davon aus, dass dieses spezielle Objekt (das ipAddress Wert, 123 Westbrook), aber welcher Teil des Pfades ist tatsächlich gegeben XMLStarlet? Die Klammern? Der Parametername? Von Schrägstrichen getrennt?

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>

Welches sollte auf den Wert zeigen 123_Westbrook? Schrägstriche einfügen? Etwas anderes?

Die Originaldatei ist sehr groß, daher ist hier der erste Teil des XML (viele der schließenden Tags fehlen, indem 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
2018-01-15 00:09


Ursprung




Antworten:


Welche Bedeutung haben diese zusätzlichen Felder? es?

es bedeutet, dass ipAddress kommt Form FRED.99.88.xsd XML-Schema - siehe xmlns:es="FRED.99.88.xsd" Namensraumdefinition (eine von bulkCmConfigDataFile Root-Tag-Attribute).


Ich gehe davon aus, dass dieses spezielle Objekt (ipAddress-Wert, 123 Westbrook) in Klammern gesetzt wird, aber welcher Teil des Pfades wird eigentlich an XMLStarlet übergeben?

Gemäß XMLStarlet Dokumentation:

sel (oder select) - Daten auswählen oder XML-Dokument (e) abfragen (XPATH, etc)

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önnten verwenden XPath XML-Dateielement hier auswählen.


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

Da deine Frage als eine Art Hausaufgabe für mich erscheint, gebe ich dir einfach:

  • XMLStarlet-Syntaxtipp:
    xmlstarlet sel -t <template option> <XPath to es:ipAddress tag> -n <filename.xml>
    Verwenden Sie Vorlagenoptionen mit XPATH.
  • XPath Beispiele und Sandkasten

0
2018-01-15 18:57





Um den Wert dieses Elements "es: ipAddress" mit xmlstarlet zu erhalten:

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

welches druckt: "123_Westbrook".


0
2018-02-01 09:57