Мне нужно извлечь несколько значений из файла 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>

2 ответа2

0

Каково значение этих дополнительных полей, таких как es?

es означает, что ipAddress приходит из XML-схемы FRED.99.88.xsd - посмотрите определение пространства имен 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

Чтобы получить значение этого элемента "es:ipAddress" с помощью xmlstarlet:

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

который печатает: "123_Westbrook".

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .