首页 > 解决方案 > xml反序列化的问题

问题描述

我在反序列化时遇到错误。它说xml文档中的错误。

public T XmlDeserialiseResponseObject<T>(string xml)
        {
            T returnedXmlClass;

            try
            {
                xml = XmlResponseObjectCleaner(xml);

                var doc = new XmlDocument();
                doc.LoadXml(xml);
                var reader = new XmlNodeReader(doc.DocumentElement);
                var ser = new XmlSerializer(typeof(T));

                returnedXmlClass = (T)ser.Deserialize(reader);
            }
            catch (Exception ex)
            {
                throw ex; 
            }
            return returnedXmlClass;
        }

我的 XML:

<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/elope/'><soap:Body><GetBenefitStatusFault xmlns:ns2='http://schemas.somesite.co.za/somesite/some/' schemaVersion='1.0'>
    <ErrorCode>3513</ErrorCode>
    <ErrorMessage>Membership details not valid: Match on initial not found</ErrorMessage>
</GetBenefitStatusFault></soap:Body></soap:Envelope>

XmlResponseObjectCleaner:

 private string XmlResponseObjectCleaner(string xml)
        {
            var sb = new StringBuilder();
            sb.Append(xml);

            sb.Replace(@"""", "'");
            sb.Replace("<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>", "");
            sb.Replace("</env:Envelope>", "");
            sb.Replace("<env:Header/>", "");
            sb.Replace("<env:Body>", "");
            sb.Replace("ns3:", "");
            sb.Replace("ns2:", "");
            sb.Replace("</env:Body>", "");
            sb.Replace("env", "");
            sb.Replace("T00:00:00.000+02:00", "");
            sb.Replace("T00:00:00.000Z", "");

            return sb.ToString();
        }

标签: c#xml

解决方案


你可以:

  1. 将 XML 加载到 DOM 中并选择 Body 元素并从那里解析 OuterXml
  2. 从信封开始

这是2的方法:

使用 System.IO;
使用 System.Xml.Serialization;

静态类 P
{
    静态无效主要()
    {
        const string xml = @"<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/elope/'><soap:Body><GetBenefitStatusFault xmlns:ns2='http://schemas.somesite .co.za/somesite/some/' schemaVersion='1.0'>
    <错误代码>3513</错误代码>
    <ErrorMessage>成员详细信息无效:未找到初始匹配</ErrorMessage>
</GetBenefitStatusFault></soap:Body></soap:Envelope>";

        var obj = XmlDeserialiseResponseObject<GetBenefitBody>(xml);
        if (obj.GetBenefitStatusFault 是故障 f)
        {
            System.Console.WriteLine(f.ErrorCode);
            System.Console.WriteLine(f.ErrorMessage);
        }
    }
    公共静态 T XmlDeserialiseResponseObject<T>(字符串 xml)
    {
        var ser = new XmlSerializer(typeof(Envelope<T>));
        var obj = (Envelope<T>)ser.Deserialize(new StringReader(xml));
        返回 obj.Body;
    }
}

[XmlRoot("信封", 命名空间 = "http://schemas.xmlsoap.org/soap/elope/")]
公共类信封<T>
{
    公共 T 身体 { 得到; 放; }
}

公共类 GetBenefitBody
{
    [XmlElement(命名空间 = "")]
    公共故障 GetBenefitStatusFault { get; 放; }
}
公共类故障
{
    公共 int 错误代码 { 获取;放; }
    公共字符串错误消息 { 获取;放; }
}

推荐阅读