代码之家  ›  专栏  ›  技术社区  ›  juan

反序列化具有无效值的XML流

  •  0
  • juan  · 技术社区  · 15 年前

    我正在调用一个“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)。--->system.formatException:系统 字符串“false”不是有效的布尔值 价值…

    这是显而易见的。

    问题是,我如何反序列化它而不必遍历所有节点,手工构建响应实体?有办法吗?

    我无法控制服务器

    3 回复  |  直到 15 年前
        1
  •  1
  •   Dean J    15 年前

    最快的方法似乎是将setautorizacion(布尔值)的参数更改为setautorizacion(字符串),然后在setter中转换为布尔值。另外,在那个setter和更高级的文档中记录您所做的以及为什么要这样做。

        2
  •  1
  •   Gregoire    15 年前

    可以在反序列化之前使用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>
    
        3
  •  0
  •   Mladen Prajdic    15 年前

    您必须格式化它,而不验证它是否符合您的模式。设置错误值的格式,并使用架构重新验证它。