xmlstarlet выбрать значение

Это xml-данные:

<DATA VERSION="1.0">
  <TABLES>
    <ITEM>
      <identifyer V="1234"></identifyer>
      <property1 V="abcde"></property1>
      <Property2 V="qwerty"></property2>
    </ITEM>
    <ITEM>
      <identifyer V="5678"></identifyer>
      <Property1 V="zyxwv"></property1>
      <Property2 V="dvorak"></property2>
    </ITEM>
  </TABLES>
</DATA>

Я пытаюсь найти property2 элемента, где identifyer имеет значение 1234. Я могу выбрать данные:

$ xmlstarlet sel -t -c "/DATA/TABLES/ITEM/identifyer [@V=1234]" test.xml 
<identifyer V="1234"/>

Желательны два типа вывода:

$ xmlstarlet <some magic>
<identifyer V="1234"></identifyer>
<property1 V="abcde"></property1>
<Property2 V="qwerty"></property2>

А также:

$ xmlstarlet <some magic>
qwerty

person joepd    schedule 28.09.2012    source источник


Ответы (1)


Ключ в том, чтобы начать с узла ITEM, а не с идентификатора:

$ xmlstarlet sel -t -c "/DATA/TABLES/ITEM[identifyer/@V=1234]" test.xml
<ITEM>
  <identifyer V="1234"/>
  <property1 V="abcde"/>
  <Property2 V="qwerty"/>
</ITEM>

Затем вы можете выбрать биты, которые вы хотите:

$ xmlstarlet sel -t -c "/DATA/TABLES/ITEM[identifyer/@V=1234]/*" test.xml
<identifyer V="1234"/><property1 V="abcde"/><Property2 V="qwerty"/>

$ xmlstarlet sel -t -v "/DATA/TABLES/ITEM[identifyer/@V=1234]/Property2/@V" test.xml
qwerty
person npostavs    schedule 28.09.2012
comment
Отлично, это работает :) Приятно видеть синтаксис в примере, я могу продвинуться вперед. Спасибо! - person joepd; 28.09.2012