Сценарий оболочки для извлечения значения тега

Мне удалось собрать порт mtr в Cygwin32, используя инструкции:

https://github.com/traviscross/mtr/

MTR is альтернативный инструмент traceroute с открытым исходным кодом. Он имеет как графический интерфейс, так и текстовый интерфейс Ncurses. Это не совсем классический traceroute, но мне он нравится больше.

0
24.05.2017, 10:54
3 ответа

Решение Python 3.x (с модулем xml.etree.ElementTree):

import xml.etree.ElementTree as ET

tree = ET.parse("test.xml")
root = tree.getroot()
for app in root.findall('application'):
    for m,s in zip(app.iter('machine'), app.iter('status')):
        print("%s,%s,%s" % (app.get('name'), m.text, s.text))

Вывод:

Adapter/Code1,123,Running
Adapter/Code1,456,Running
Adapter/Code2,123,Running
Adapter/Code2,456,Running

https:/ /docs.python.org/3.6/library/xml.etree.elementtree.html?highlight=etree#module-xml.etree.ElementTree


xmlstarlet + awk (используется для группировки дочерних узлов для каждого элемента application) решение:

xmlstarlet sel -t -v "//application/@name| .//machine/text()| .//status/text()" -n input.xml 
 | awk '/Adapter/{app=$0; r=app; c=0; next}
   { if(++c==2){ c=0; print r","$0; r=app } else { r=r","$0 }}'

Вывод:

Adapter/Code1,123,Running
Adapter/Code1,456,Running
Adapter/Code2,123,Running
Adapter/Code2,456,Running

  • "//application/@name| .//machine/text()| .//status/text()" - выражение XPath для получения необходимых узлов

  • /Adapter/{app=$0; р = приложение; с=0; next} - захват имени каждого приложения для дальнейшей конкатенации

http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html

2
28.01.2020, 02:25

Установите xidel и используйте xpath.

На мой взгляд, лучшая точка зрения исходит из serviceInstance:

xidel f.xml -e '//serviceInstance/string-join((../../@name, machine, status),",")'
Adapter/Code1,123,Running
Adapter/Code1,456,Running
Adapter/Code2,123,Running
Adapter/Code2,456,Running
1
28.01.2020, 02:25

приложение остается тривиальным, как ваш пример:

sed 's/<application name="\([^"]*\)">/\1/
Ta
h
d
:a
/<machine>/!d
G
N
s_.*<machine>\(.*\)</machine>\n\(.*\)\n.*<status>\(.*\)</status>.*_\2,\1,\3_' yourfile.xml
-1
28.01.2020, 02:25

Теги

Похожие вопросы