XML-запрос в Bash с помощью XMLStarlet

1216
gmark

Мне нужно извлечь несколько значений из файла XML, и я наткнулся на XMLStarlet, который кажется довольно мощным. Немного зная о XML, я перегружен этим инструментом и, вероятно, нуждаюсь лишь в крошечной его части. У меня есть файл, подобный следующему, и я хотел получить, скажем, следующий адрес:

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

Как бы я это напечатал?

Какое значение имеют эти дополнительные поля es? Я предполагаю, что это заключает в скобки этот конкретный объект ( ipAddressзначение, 123 Westbrook), но какая часть пути фактически дается XMLStarlet ? Скобки? Имя параметра? Отделены косыми чертами?

Может быть:

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

Что должно указывать на стоимость 123_Westbrook? Вставить косую черту? Что-то другое?

Исходный файл очень большой, поэтому вот первая часть XML (многие из закрывающих тегов отсутствуют, если они публикуют только его часть):

 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 ответа на вопрос

0
g2mk

Какое значение имеют эти дополнительные поля es?

esозначает, что ipAddressприходит из FRED.99.88.xsdXML-схемы - посмотрите xmlns:es="FRED.99.88.xsd"определение пространства имен (один из bulkCmConfigDataFileатрибутов корневого тега).


Я предполагаю, что это заключает в скобки этот конкретный объект (значение ipAddress, 123 Westbrook), но какая часть пути фактически дана XMLStarlet?

Согласно документации XMLStarlet :

sel (или select) - выберите данные или запросите XML-документ (ы) (XPATH и т. д.)

и после 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" ...  

Вы можете использовать XPath для выбора элемента файла XML здесь.


Что должно указывать на значение 123_Westbrook? Вставить косую черту? Что-то другое?

Поскольку ваш вопрос кажется мне домашним заданием, я просто даю вам следующее:

  • Совет по синтаксису XMLStarlet:
    xmlstarlet sel -t <template option> <XPath to es:ipAddress tag> -n <filename.xml>
    используйте параметры шаблона, содержащие XPATH.
  • Примеры XPath и песочница
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".