【问题标题】:How to parse XML data with some non-xml formatted elements at Python如何在 Python 中使用一些非 xml 格式的元素解析 XML 数据
【发布时间】:2021-03-21 15:34:26
【问题描述】:

我从 CUCM api 得到以下答案:

<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns:executeSQLQueryResponse xmlns:ns="http://www.cisco.com/AXL/API/12.5"><return><row><pkid>63d1f8a1-0964-caa0-d496-ff91340c236c</pkid><userid>Semenova.LA</userid><firstname/><lastname>Семенова</lastname><snrenabled>t</snrenabled><devicecount>1</devicecount><licensetype>Enhanced         </licensetype><licenses>1</licenses></row></return></ns:executeSQLQueryResponse></soapenv:Body></soapenv:Envelope>

我试图解析这个答案。我使用了 lxml 库。

from lxml import etree

root = etree.fromstring(response)

但我收到以下错误

文件“src\lxml\etree.pyx”,第 3237 行,在 lxml.etree.fromstring 文件“src\lxml\parser.pxi”,第 1891 行,在 lxml.etree._parseMemoryDocument ValueError:不支持带有编码声明的 Unicode 字符串。请使用未声明的字节输入或 XML 片段。

它看起来像是不支持的答案中的一些元素 如果我削减回应

response='''<return><row><pkid>63d1f8a1-0964-caa0-d496-ff91340c236c</pkid><userid>Semenova.LA</userid><firstname/><lastname>Семенова</lastname><snrenabled>t</snrenabled><devicecount>1</devicecount><licensetype>Enhanced         </licensetype><licenses>1</licenses></row></return>'''

一切都按预期工作 我应该怎么做才能修复它? 我应该删除不需要的元素,例如:

 <?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns:executeSQLQueryResponse xmlns:ns="http://www.cisco.com/AXL/API/12.5">

我该怎么做?

非常感谢!

【问题讨论】:

    标签: xml-parsing lxml cisco


    【解决方案1】:

    尝试改变

    root = etree.fromstring(response)
    

    root = etree.fromstring(resp.encode())
    

    【讨论】:

    • 不幸的是,它不能解决问题“代码”schemas.xmlsoap.org/soap/envelope}Envelope at 0x1dcfa363740>
    【解决方案2】:

    我应用了不可扩展的解决方案 - 只是通过模板剪切开始和结束字符串

    cut_string ='''<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns:executeSQLQueryResponse xmlns:ns="http://www.cisco.com/AXL/API/12.5">'''
    cut_string2 = '''</ns:executeSQLQueryResponse></soapenv:Body></soapenv:Envelope>'''
    s = response.replace(cut_string, "")
    ss = s.replace(cut_string2, "")
    root = etree.fromstring(ss.encode())
    

    还有更聪明的解决方案吗?

    例如 - 获取 return>String</return>

    之间的字符串

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      相关资源
      最近更新 更多