从XML中删除CDATA

时间:2014-08-12 11:37:56

标签: python xml cdata

我正在使用python-suds开发SOAP api。

Api返回结果,suds根据WSDL解析它。结果数据具有XML数据字段

(MyServiceResult){
    errorMsg = "Error Message here..."
    sessionId = "..."
    outputDataXML = "<![CDATA[<Results>.....<Details>....</Details></Results>]]>"
    errorCode = "00"
 }

所以我打算使用xml.etree.ElementTree来解析xml数据部分outputDataXML。但由于返回的数据以<![CDATA[开头,因此xml解析器失败并带有

  

ParseError:语法错误:第1行,第0列

除了使用正则表达式之外,这种情况的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

调用ET.fromstring一次从CDATA中提取文本。再次调用ET.fromstring将字符串解析为XML:

import xml.etree.ElementTree as ET

d = '<![CDATA[<Results>.....<Details>....</Details></Results>]]>'
fix = '<root>{}</root>'.format(d)

content = ET.fromstring(fix).text
print(repr(content))
# '<Results>.....<Details>....</Details></Results>'

results = ET.fromstring(content)
print(ET.tostring(results))
# <Results>.....<Details>....</Details></Results>

答案 1 :(得分:1)

在阅读各种奇怪的格式化类XML数据时,您始终可以使用BeautifulSoup

>>> from bs4 import BeautifulSoup
>>> d="<![CDATA[<Results>.....<Details>....</Details></Results>]]>"
>>> soup=BeautifulSoup(d)
>>> from xml.etree import ElementTree
>>> tree=ElementTree.fromstring(str(soup))

否则,你可以像这样快速破解:

tree = ElementTree.fromstring(outputDataXML.replace("<![CDATA[", "").replace("]]>", ""))