我有一个未经过清理的WebService的“XML”响应。含义包含非法字符,特殊字符, html标记和十六进制。
对这种反应进行消毒的最佳方法是什么?
这是服务中的Xml示例。
<root>
<response>
<type>E</type>
<code>CMNE_00034</code>
<source>CMNQ3030</source>
<message>some valid message here.</message>
<detail>Error details here
line 114: endif
line 115: edit
line 116: else
> line 117: call LP_ACCEPT()
line 118: return ($status)
line 119: endif
line 120: done<end of module> // invalid here
at CMNQ3030.EXEC line 117: call LP_ACCEPT()
at GPCSY_RUN line 5: activate INSTANCENAME."EXEC"( )
at CSYV1000.LOGON line 159: call GPCSY_RUN()
</detail>
</response>
</root>
我已经尝试了很多东西,从创建具有设置的XmlReader
开始,就像这样。
public XDocument CreateXmlDocument(string content)
{
using (var reader = XmlReader.Create(new StringReader(content), CreateXmlReaderSettings()))
{
return XDocument.Load(reader);
}
}
private static XmlReaderSettings CreateXmlReaderSettings()
{
return new XmlReaderSettings { CheckCharacters = false };
}
从XmlDocument更改为XDocument并在实际读取之前使用Encoding.UTF8.GetBytes
。
答案 0 :(得分:3)
.NET中的XMLReader
,XDocument
等基础设施不太可能被要求阅读和解析格式错误的XML。
我建议在将XML加载到XML对象之前对其进行预处理。
在上面的例子中,看起来Web服务正在<detail>...</detail>
元素中返回一条错误消息,该消息应真正包含在CDATA中,如下所示:
<root>
<response>
<type>E</type>
<code>CMNE_00034</code>
<source>CMNQ3030</source>
<message>some valid message here.</message>
<detail><![CDATA[
Error details here
line 114: endif
line 115: edit
line 116: else
> line 117: call LP_ACCEPT()
line 118: return ($status)
line 119: endif
line 120: done<end of module> // invalid here
at CMNQ3030.EXEC line 117: call LP_ACCEPT()
at GPCSY_RUN line 5: activate INSTANCENAME."EXEC"( )
at CSYV1000.LOGON line 159: call GPCSY_RUN()
]]>
</detail>
</response>
</root>
你应该能够很快地将解析器拼凑起来,在<detail>
标记的末尾和</detail>
标记的开头之间查找,提取和包装文本。{{1} }和<[CDATA[
代码。
当然,服务的XML中可能还有其他字段也包含字符串数据或格式错误的字符等。您可能需要查找并替换这些字符,例如正则表达式等。
更正后,您可以毫不费力地将干净的XML加载到XMLDocuments / XDocuments等中。
HTH。