我可能得到两种XML输出-
输出1:
<?xml version="1.0" encoding="UTF-8"?>
<BESAPI xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="BESAPI.xsd">
<Action>
<ActionID>123</ActionID>
</Action>
</BESAPI>
输出2:
<?xml version="1.0" encoding="UTF-8"?>
<BESAPI xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="BESAPI.xsd">
<Action>
<ActionID>789</ActionID>
<Computer ID="456">
<Status>The action is successful.</Status>
</Computer>
</Action>
</BESAPI>
我想打印计算机状态到一个列表,如果存在。如果没有,打印操作ID。
这是我的代码,但它没有给出任何结果的XML输出1-
import xml.etree.ElementTree as ET
actionstatuslist = []
doc = ET.parse('actionstatus.xml')
root = doc.getroot()
for elem in root.findall('.//Computer'):
for subelem in elem.findall('Status'):
if subelem is None:
for el in root.iter('Action'):
for subel in el.iter('ActionID'):
actionid = int(subel.text)
print(actionid)
else:
actionstatuslist.append(subelem.text)
XML输出1的期望结果-
123
我得到正确的计算机状态结果为XML输出2虽然-
'The action is successful.'
我需要输出1场景的帮助。
由于root.findall('.//Computer')
返回空列表([]
),它不执行
for elem in root.findall('.//Computer'):
for subelem in elem.findall('Status'):
if subelem is None:
for el in root.iter('Action'):
for subel in el.iter('ActionID'):
actionid = int(subel.text)
print(actionid)
else:
actionstatuslist.append(subelem.text)
所以首先需要检查root.findall('.//Computer')
是否为空,然后检查elem.findall('Status')
是否为空。如果它们为空,则运行
for el in root.iter('Action'):
for subel in el.iter('ActionID'):
actionid = int(subel.text)
print(actionid)
如果你把它作为一个函数使用会更容易
最终代码将像这样:
import xml.etree.ElementTree as ET
actionstatuslist = []
doc = ET.parse('actionstatus.xml')
root = doc.getroot()
def get_action_id():
for el in root.iter('Action'):
for subel in el.iter('ActionID'):
actionid = int(subel.text)
print(actionid)
if root.findall('.//Computer'):
for elem in root.findall('.//Computer'):
if elem.findall('Status'):
for subelem in elem.findall('Status'):
actionstatuslist.append(subelem.text)
else:
get_action_id()
else:
get_action_id()
在最终代码中编辑(在注释中添加请求的功能):
import xml.etree.ElementTree as ET
actionstatuslist = []
doc = ET.parse('actionstatus.xml')
root = doc.getroot()
def get_action_id():
for el in root.iter('Action'):
for subel in el.iter('ActionID'):
actionid = int(subel.text)
print(actionid)
get_action_id()
for elem in root.findall('.//Computer'):
if elem.findall('Status'):
for subelem in elem.findall('Status'):
actionstatuslist.append(subelem.text)
print(elem.get('ID'))
import xml.etree.ElementTree as ET
actionstatuslist = []
doc = ET.parse('actionstatus.xml')
root = doc.getroot()
for child in root.iter('Action'):
grand_child=child.find("Computer/Status")
if grand_child != None:
actionstatuslist.append(grand_child.text)
else:
temp=child.find("ActionID")
actionstatuslist.append(temp.text)
首先,我们在child中有Action
标签,我们正在寻找Computer/Status
,使用if
或者我们将直接获得ActionID
。