使用无效值反序列化xml流

时间:2009-11-30 15:48:57

标签: c# .net serialization

我正在调用一个“Web服务”,它将xml响应作为一个无效节点,因此当我尝试反序列化它时,它会引发异常。

我正在使用XmlSerializer类,如下所示:

internal class Response<T>
{
    public Response(byte[] xml)
    {
        XmlSerializer s = new XmlSerializer(typeof(T));
        XmlReader reader = XmlReader.Create(new MemoryStream(xml));

         if (s.CanDeserialize(reader))
             this.ActualResponse = (T)s.Deserialize(reader);
    }

    public T ActualResponse { get; private set; }
}

我遇到问题的节点看起来像这样:

<autorizacion>FALSE</autorizacion>

我得到的例外是

  

System.InvalidOperationException:   XML文档中存在错误(7,   35)。 ---&GT; System.FormatException:The   字符串'FALSE'不是有效的布尔值   值..

这是显而易见的。

问题是,如何在不必迭代所有节点的情况下反序列化它,手动构建我的响应实体?有办法吗?

我无法控制服务器

3 个答案:

答案 0 :(得分:1)

您可以在反序列化之前使用Xsl重新格式化xml

修改

使用c#进行xsl变换:http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=63

你的xsl应该包含类似的东西

<xsl:template match="autorizacion">
  <autorizacion><xsl:value-of select="concat(upper-case(substring(current(),1,1)),           substring(current(),2))" />
</autorizacion>
</xsl:template>

答案 1 :(得分:1)

最快的方法似乎是将setAutorizacion(boolean)的参数更改为setAutorizacion(String),然后在setter中转换为boolean。此外,记录您所做的以及为什么在该setter和更高级别的文档中都这样做。

答案 2 :(得分:0)

您必须对其进行格式化,而不对其架构进行验证。格式化错误的值并使用模式重新验证它。