如果xml元素名不存在,Python继续



我可能得到两种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

最新更新