Python 当元素可能不总是存在时解析XML段
我有一个从包含状态信息的API接收的XML字符串。根据操作是否成功,XML中可能有不同的元素 例如:Python 当元素可能不总是存在时解析XML段,python,xml,Python,Xml,我有一个从包含状态信息的API接收的XML字符串。根据操作是否成功,XML中可能有不同的元素 例如: <?xml version="1.0" encoding="UTF-8"?> <content> <status>ok</status> <response>ok</response> <jobid>[integer]</jobid> </content> 好啊 好啊 [整数] 或
<?xml version="1.0" encoding="UTF-8"?>
<content>
<status>ok</status>
<response>ok</response>
<jobid>[integer]</jobid>
</content>
好啊
好啊
[整数]
或者可能:
<?xml version="1.0" encoding="UTF-8"?>
<content>
<status>fail</status>
<error>missingdata</error>
</content>
失败
缺失数据
我尝试使用ElementTree解析XML数据,提取每个项的值,将它们转换为字符串(如果需要),保存为变量,并将数据写入日志文件。让我感到困惑的是,我无法确定那里会有哪些元素
我一直在使用此链接作为指导:
尝试使用Try/except:
import xml.etree.ElementTree as ET
from lxml import etree
tree = ET.parse('test.xml')
root = tree.getroot()
for child in root:
try:
x = child.find('response').text
except AttributeError:
continue
如果有
响应
元素,x将给出值,否则跳过它。将其用于所有可能的元素这是一个从xml数据中读取所有现有元素并将其存储在字典中的示例:
import xml.etree.ElementTree as et
xml1="""<?xml version="1.0" encoding="UTF-8"?>
<content>
<status>ok</status>
<response>ok</response>
<jobid>[integer]</jobid>
</content>
"""
xml2="""<?xml version="1.0" encoding="UTF-8"?>
<content>
<status>fail</status>
<error>missingdata</error>
</content>
"""
def get_elements(xml_input):
ret = {}
tree = et.fromstring(xml_input)
for el in tree:
ret[el.tag] = el.text
return ret
print get_elements(xml1)
print get_elements(xml2)
将xml.etree.ElementTree作为et导入
xml1=“”
好啊
好啊
[整数]
"""
xml2=“”
失败
缺失数据
"""
def get_元素(xml_输入):
ret={}
tree=et.fromstring(xml\u输入)
对于树中的el:
ret[el.tag]=el.text
回程网
打印get_元素(xml1)
打印get_元素(xml2)
我建议创建一个简单的类来解析XML,将所有二级节点转换为对象属性。然后,我们可以检查状态是否为ok或fail,并相应地采取行动。以下是一个示例:
import xml.etree.ElementTree as ET
class XmlResponse(object):
'''
A simple class to parse a response XML
'''
def parseString(self, xml_string):
'''
Parses an XML block of text and convert all secondary nodes into
attributes for this object.
'''
root = ET.fromstring(xml_string)
for node in root:
setattr(self, node.tag, node.text)
def parse(self, filename):
'''
Parses an XML file and convert all secondary nodes into attributes for
this object.
'''
with open(filename) as f:
self.parseString(f.read())
def interpret_response(filename):
'''
A simple demo of how to use the XMLResponse class
'''
response = XmlResponse()
response.parse(filename)
if response.status == 'ok':
print 'Job ID:', response.jobid
else:
print 'Error:', response.error
if __name__ == '__main__':
interpret_response('ok.xml')
interpret_response('fail.xml')
为了简单起见,我不检查错误(例如找不到文件),但您应该检查