来自WebService的Unsanitized XML,如何清理

时间:2015-03-17 06:24:44

标签: c# regex xml serialization

我有一个未经过清理的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

1 个答案:

答案 0 :(得分:3)

.NET中的XMLReaderXDocument等基础设施不太可能被要求阅读和解析格式错误的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。