从Curl输出解析XML

时间:2018-06-14 03:06:34

标签: python xml bash xml-parsing

查询我的内部API时,我得到了一堆响应。这些回复将告诉我特定服务是否上升/下降。

卷曲命令:

curl https://myinternalapi.example.com/Ping/1.1

输出:

<?xml version="1.0" encoding="UTF-8"?><ping><service name="FBcheckOnline" status="down"/><service name="APICheckOn" status="up"/></ping>

我想使用Python / Bash解析输出数据。解析数据后,我可以创建if语句来检查特定服务是启动还是关闭。

所需的输出类似于:

FBcheckOnline down
APICheckOn up

我怎样才能使用Python(2.7)或Bash?

编辑1 :我设法使用Python 2.7

from xml.dom import minidom
xmldoc = minidom.parse('test.xml')
items = xmldoc.getElementsByTagName('service')

for item in items:
    print item.attributes['name'].value, 
    print item.attributes['status'].value

但是,我试图让它从curl命令而不是文件解析数据...或者使用curl命令将输出发送到文件然后读取它。

2 个答案:

答案 0 :(得分:1)

我设法通过以下方式得到了我需要的东西:

#!/usr/bin/python
#
#

from xml.dom import minidom
import subprocess

p = subprocess.Popen("curl -s https://api.example.com/Ping/1.1 > curl_api_output_3.xml", stdout=subprocess.PIPE, shell=True)
(output, err) = p.communicate()

xmldoc = minidom.parse('curl_api_output_3.xml')
items = xmldoc.getElementsByTagName('service')

for item in items:
    print item.attributes['name'].value,
    print item.attributes['status'].value

您可以随意发表评论,因为我是Python新手。

答案 1 :(得分:1)

不完全解析XML,但如果输出格式一致,您可以尝试类似

的内容
curl -Ssk https://myinternalapi.example.com/Ping/1.1 | tr '<|/' '\n' | grep ^service | tr '+|=|"' ' ' | awk '{print $3, $NF}'