у меня есть XML-файл, например:XMLStarlet: Запросы и конкатенации вложенных дочерних элементов с помощью одного запроса
<?xml version="1.0" encoding="utf-8"?>
<project>
<data>
<modelType type="InstantMessage">
<model type="InstantMessage" id="1" >
<modelField name="From" type="Party">
<model type="Party" id="123456">
<field name="Identifier" type="String">
<value type="String">foo</value>
</field>
</model>
</modelField>
<multiModelField name="To" type="Party" />
<field name="Body" type="String">
<value type="String">bar</value>
</field>
<field name="TimeStamp" type="TimeStamp">
<value type="TimeStamp">2016-07-11 13:26:38+02:00</value>
</field>
</model>
</modelType>
</data>
Я хочу, чтобы произвести следующий результат с помощью одного запроса:
foo|bar
Я не знаю, как получить доступ к этим полям, когда они вложены на разные уровни. Я пробовал что-то вроде:
[email protected]:/.../# xmlstarlet sel -T -t -m /project/data/modelType/model -v "concat(/modelField/model/field/value'|'/field[@Body]/value)" file.xml
но я постоянно получал синтаксические ошибки от xmlstarlet. Я не понимаю, как использовать его с manual. Кто-нибудь знает, как использовать xmlstarlet в этом случае?
Спасибо, Питер
Отличное объяснение !! – user3586330
Это такой отличный ответ! Единственное, что есть, состоит из двух отсутствующих котировок после '-m' и' [@ name = "Идентификатор"]/value' здесь, с добавленными котировками 'xmlstarlet sel -T \ -t -m '/ проект/данные/modelType/model '\ -v' .//field[@name="Identifier"]/value '\ -o' | ' \ -v './/field[@name="Body"]/value' \ file.xml' – jarisky
@jarisky: Спасибо за корректуру. Исправлена. – rici