Python 3.x solução (com o módulo 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))
A saída:
Adapter/Code1,123,Running
Adapter/Code1,456,Running
Adapter/Code2,123,Running
Adapter/Code2,456,Running
Solução xmlstarlet + awk (usada para agrupar nós filhos para cada elemento 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 }}'
A saída:
Adapter/Code1,123,Running
Adapter/Code1,456,Running
Adapter/Code2,123,Running
Adapter/Code2,456,Running
-
"//application/@name| .//machine/text()| .//status/text()"
- expressão XPath para obter os nós necessários -
/Adapter/{app=$0; r=app; c=0; next}
- capturando cadaapplication
nome para outra concatenação