Выбирая элементы из файла XML с помощью xmlstarlet, не могу получить правильный синтаксис - PullRequest
2 голосов
/ 28 июня 2010

Вот фрагмент кода xml:

$ cat short.xml 
<hostnames>
    <hostname name="yahoo.com" type="user"/>
    <hostname name="ir1.fp.vip.sp2.yahoo.com" type="PTR"/>
</hostnames>
<hostnames>
    <hostname name="Inc.com" type="user"/>
    <hostname name="www.inc.com" type="PTR"/>
</hostnames>

Требуемый результат:

yahoo.com | ir1.fp.vip.sp2.yahoo.com
Inc.com | www.inc.com

То, что у меня есть, работает только частично: $ xml sel -t -m"// hostname" -v "@name" -n short.xml

Кажется, я не могу правильно перехватить условие Type =.ТИА.

Ответы [ 3 ]

4 голосов
/ 15 марта 2011

Еще два решения, использующие xmlstarlet только один раз (не нужно повторять):

xmlstr='
<root>
  <hostnames>
    <hostname name="yahoo.com" type="user"/>
    <hostname name="ir1.fp.vip.sp2.yahoo.com" type="PTR"/>
  </hostnames>
  <hostnames>
    <hostname name="Inc.com" type="user"/>
    <hostname name="www.inc.com" type="PTR"/>
  </hostnames>
</root>
'

echo "$xmlstr" | xmlstarlet sel -T -t -m "//hostnames" -m "hostname[@type='user']" -v '@name' -o " | " -b -m "hostname[@type='PTR']" -v '@name' -n

echo "$xmlstr" | xmlstarlet sel -T -t -m "//hostname" -i "@type='user'" -v '@name' -o " | " -b -i "@type='PTR'" -v '@name' -n
3 голосов
/ 05 февраля 2011

Вам нужно посчитать имена хостов с помощью xmlstarlet el или чего-то еще, а затем повторить что-то вроде:

xmlstarlet sel -t -c "//hostnames[1]" short.xml | xmlstarlet sel -t -m "//hostname/@name" -v . -o ' | '

Это было бы намного проще, если бы XML был лучше разработан.:)

0 голосов
/ 16 января 2013

Пример, приведенный в вопросе, является недействительным xml.

xmlstarlet --version
1.3.1
compiled against libxml2 2.8.0, linked with 20800
compiled against libxslt 1.1.26, linked with 10126
xmlstarlet val -e short.xml 
short.xml:5.1: Extra content at the end of the document
<hostnames>
^
short.xml - invalid

Идея в ответе от mitm - довольно хорошее лекарство.

...