Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当元素可能不总是存在时解析XML段_Python_Xml - Fatal编程技术网

Python 当元素可能不总是存在时解析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> 好啊 好啊 [整数] 或

我有一个从包含状态信息的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>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,将所有二级节点转换为对象属性。然后,我们可以检查状态是否为okfail,并相应地采取行动。以下是一个示例:

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')
为了简单起见,我不检查错误(例如找不到文件),但您应该检查