Получить значение заданного атрибута дочернего узла - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь получить значение дочернего узла данного узла на компьютере Windows. Предположим, у меня есть следующая структура XML:

<xsd:type name="type1">
    <xsd:example>
      <xsd:description>This is the description of said type1 tag</xsd:description>
    </xsd:example>
</xsd:type>

Я бы хотел получить значение между тегом xsd: description, учитывая, что он является дочерним по отношению к тегу xsd: type с name = "type1"атрибут. Другими словами, я хотел бы получить «Это описание указанного тега type1».

На Mac я могу запустить приведенную ниже команду, чтобы получить следующую команду:

xml sel -t -v "//xsd:type[@name=\"type1\"]" -n filePath.xml

, которая затем возвращает: «Это описание указанного тега type1»как и ожидалось.

Однако, когда я запускаю точно такую ​​же команду на моем компьютере с Windows, команда возвращает пустую строку. Я не уверен, в чем разница между Mac и Windows, но я не могу понять, какая команда Windows эквивалентна.

1 Ответ

1 голос
/ 04 ноября 2019

Скорее всего, это связано с неправильным определением пространства имен.

XML Starlet предоставляет параметр -N, который описывается как:

-N <name>=<value>     - predefine namespaces (name without 'xmlns:')
                        ex: xsql=urn:oracle-xsql

Вместо этого измените команду на:

xml sel -N xsd="http://www.w3.org/2001/XMLSchema" -t -v "//xsd:type[@name=\"type1\"]//xsd:description/text()" -n filePath.xml

Примечания:

  1. Часть ниже была добавлена ​​впредопределите пространство имен для выражения XPath, чтобы оно адресовало элементы в правильном пространстве имен:

    -N xsd="http://www.w3.org/2001/XMLSchema"

  2. Также выражение XPathбыло изменено на следующее, чтобы лучше соответствовать вашим фактическим требованиям:

    "//xsd:type[@name=\"type1\"]//xsd:description/text()"

    Это выражение соответствует узлу text() любого узла элемента xsd:description, который являетсяпотомок любого элемента xsd:type, который имеет атрибут name="type1".

...