как вывести несколько строк с помощью xmlint и xpath

Я пишу простой скрипт bash для анализа некоторого xml. Я использовал sed и awk, но думаю, что xmllint подходит лучше.

К сожалению, я совершенно новичок в xpath, поэтому я действительно борюсь.

Я пытаюсь взять следующий xml:

<?xml version="1.0" encoding="UTF-8"?>
<releaseNote>
<name>APPLICATION_ercc2</name>
<change>
  <date hour="11" day="10" second="21" year="2013" month="0" minute="47"/>
  <submitter>Automatically Generated</submitter>
  <description>ReleaseNote Created</description>
</change>
<change>
  <version>2</version>
  <date hour="11" day="10" second="25" year="2013" month="1" minute="47"/>
  <submitter>fred.bloggs</submitter>
  <description> first version</description>
<install/>
</change>
<change>
  <version>3</version>
  <date hour="12" day="10" second="34" year="2013" month="1" minute="2"/>
  <submitter>fred.bloggs</submitter>
  <description> tweaks</description>
<install/>
</change>
<change>
  <version>4</version>
  <date hour="15" day="10" second="52" year="2013" month="1" minute="38"/>
  <submitter>fred.bloggs</submitter>
  <description> fixed missing image, dummy user, etc</description>
  <install/>
</change>
<change>
  <version>5</version>
  <date hour="17" day="10" second="31" year="2013" month="1" minute="40"/>
  <submitter>fred.bloggs</submitter>
  <description> fixed auth filter and added multi opco stuff</description>
  <install/>
</change>

.....

и обработайте его, чтобы передать «3» в качестве переменной в сценарий xpath и вывести что-то вроде этого:

4    fred.bloggs    10/1/2013 15:38     fixed missing image, dummy user, etc
5    fred.bloggs    10/1/2013 17:40     fixed auth filter and added multi opco stuff

Другими словами, сложная комбинация содержимого каждого узла, где значение версии больше, например, 3.


person mdarwin    schedule 13.06.2013    source источник


Ответы (1)


Одним из инструментов, который может оказаться полезным для такого рода вещей, является xmlstarlet, хотя использование инструмента xpath может быть менее своеобразным.

С xmlstarlet работает следующее (я добавил в ваш пример закрывающий тег для releaseNote):

$ summary() {
  xmlstarlet sel -t -m "//change[version > $2]" \
                    -v submitter -o $'\t' \
                    -v date/@day -o '/' -v date/@month -o '/' -v date/@year -o ' ' \
                    -v date/@hour -o ':' -v date/@minute -o $'\t' \
                    -v description -n $1
}
$ summary test.xml 3
fred.bloggs     10/1/2013 15:38  fixed missing image, dummy user, etc
fred.bloggs     10/1/2013 17:40  fixed auth filter and added multi opco stuff

$
person rici    schedule 13.06.2013
comment
Не слышал о xmlstarlet. Интересно. - person LarsH; 13.06.2013