2013-06-13 4 views
2

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

К сожалению, я совершенно не знаком с 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.

ответ

2

Один инструмент, который может вам пригодиться для такого рода вещей, - 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 

$ 
+0

Если бы не слышал о XMLStarlet. Интересно. – LarsH

Смежные вопросы