Десериализация .NET Xml, проблема / ошибка с атрибутом xsi: type - PullRequest
0 голосов
/ 23 марта 2012

VS2008, .NET Framework 3.5

Мы используем API WebEx Xml. Вот пример ответа Xml от их веб-службы, который я пытаюсь десериализовать в классы .NET.

<?xml version="1.0" encoding="UTF-8"?>
<serv:message xmlns:serv="http://www.webex.com/schemas/2002/06/service" xmlns:com="http://www.webex.com/schemas/2002/06/common" 

xmlns:event="http://www.webex.com/schemas/2002/06/service/event"><serv:header><serv:response><serv:result>SUCCESS</serv:result><serv:gsbStatus>PRIMARY</s

erv:gsbStatus></serv:response></serv:header>
<serv:body>
<serv:bodyContent xsi:type="event:lstsummaryEventResponse" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<event:matchingRecords>
    <serv:total>2</serv:total>
    <serv:returned>2</serv:returned>
    <serv:startFrom>1</serv:startFrom>
</event:matchingRecords>
<event:event>
    <event:sessionKey>999999</event:sessionKey>
    <event:sessionName>Test Event 1</event:sessionName>
    <event:sessionType>129</event:sessionType>
    <event:hostWebExID>SomeName</event:hostWebExID>
    <event:startDate>03/28/2012 14:30:00</event:startDate>
    <event:endDate>03/28/2012 14:45:00</event:endDate>
    <event:timeZoneID>11</event:timeZoneID>
    <event:duration>15</event:duration>
    <event:description></event:description>
    <event:status>NOT_INPROGRESS</event:status>
    <event:panelists></event:panelists>
    <event:listStatus>PUBLIC</event:listStatus>
</event:event>
</serv:bodyContent>
</serv:body>
</serv:message>

Вот класс, в который мы десериализуем:

using System;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;
using System.Collections.Generic;

namespace Masonite.MTier.WebEx
{
    [Serializable()]
    [XmlRoot("message", Namespace = "http://www.webex.com/schemas/2002/06/service")]
    public class lstsummaryEventResponsexx
    {
        [XmlNamespaceDeclarations]
        public XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();

        public lstsummaryEventResponsexx()
        {
            xmlns.Add("serv", "http://www.webex.com/schemas/2002/06/service");
            xmlns.Add("com", "http://www.webex.com/schemas/2002/06/common");
            xmlns.Add("event", "http://www.webex.com/schemas/2002/06/service/event");
        }


        [XmlElement(ElementName = "header")]
        public Header header { get; set; }

        [XmlElement(ElementName = "body")]
        public Body body { get; set; }


        [Serializable()]
        [XmlRoot("header")]
        public class Header
        {
            [XmlElement(ElementName = "response")]
            public Response response { get; set; }
        }


        [Serializable()]
        [XmlRoot("body")]
        [XmlInclude(typeof(lstsummaryEventResponse))]
        public class Body
        {
            [XmlElement(ElementName = "bodyContent", Form = XmlSchemaForm.Qualified)]
            public BodyContent bodyContent { get; set; }
        }

        [Serializable()]
        public class lstsummaryEventResponse
        {

        }

        [Serializable()]
        [XmlRoot("response")]
        public class Response
        {
            [XmlElement(ElementName = "result")]
            public string result { get; set; }

            [XmlElement(ElementName = "reason")]
            public string reason { get; set; }

            [XmlElement(ElementName = "gsbStatus")]
            public string gsbStatus { get; set; }

            [XmlElement(ElementName = "exceptionID")]
            public string exceptionID { get; set; }
        }


        [Serializable()]
        [XmlRoot("bodyContent")]
        public class BodyContent
        {            
            [XmlElement(ElementName = "matchingRecords", Namespace = "http://www.webex.com/schemas/2002/06/service/event")]
            public MatchingRecords matchingRecords { get; set; }

            [XmlElement(ElementName = "event", Namespace = "http://www.webex.com/schemas/2002/06/service/event")]
            public List<EventSummary> events { get; set; }
        }


        [Serializable()]
        [XmlRoot("matchingRecords")]
        public class MatchingRecords
        {
            [XmlElement(ElementName = "total", Namespace = "http://www.webex.com/schemas/2002/06/service")]
            public int total { get; set; }

            [XmlElement(ElementName = "returned", Namespace = "http://www.webex.com/schemas/2002/06/service")]
            public int returned { get; set; }

            [XmlElement(ElementName = "startFrom", Namespace = "http://www.webex.com/schemas/2002/06/service")]
            public int startFrom { get; set; }
        }


        [Serializable()]
        [XmlRoot("event")]
        public class EventSummary
        {
            [XmlElement(ElementName = "sessionKey")]
            public long sessionKey { get; set; }

            [XmlElement(ElementName = "sessionName")]
            public string sessionName { get; set; }

            [XmlElement(ElementName = "sessionType")]
            public int sessionType { get; set; }

            [XmlElement(ElementName = "hostWebExID")]
            public string hostWebExID { get; set; }

            [XmlElement(ElementName = "startDate")]
            public string startDate { get; set; }

            [XmlElement(ElementName = "endDate")]
            public string endDate { get; set; }

            [XmlElement(ElementName = "timeZoneID")]
            public int timeZoneID { get; set; }

            [XmlElement(ElementName = "duration")]
            public int duration { get; set; }

            [XmlElement(ElementName = "description")]
            public string description { get; set; }

            [XmlElement(ElementName = "status")]
            public string status { get; set; }

            [XmlElement(ElementName = "panelists")]
            public string panelists { get; set; }

            [XmlElement(ElementName = "listStatus")]
            public listingType listStatus { get; set; }
        }
    }
}

Ошибка, которую я получаю:

The specified type was not recognized: name='lstsummaryEventResponse', namespace='http://www.webex.com/schemas/2002/06/service/event', at <bodyContent xmlns='http://www.webex.com/schemas/2002/06/service'>  

Я не уверен, как предоставить тип lstsummaryEventResponse для метода Deserialize. Я добавил еще один сериализуемый класс в свой класс выше, используя это имя, но получил ту же ошибку. Какие-нибудь мысли?

1 Ответ

1 голос
/ 24 марта 2012

BodyContent может иметь тип event:lstsummaryEventResponse - поэтому вы должны объявить соответствующий класс, а затем оформить объявление BodyContent следующим образом:

    [Serializable()] 
    [XmlRoot("bodyContent")] 
    [XmlInclude("lstsummaryEventResponse")]
    public class BodyContent {

    }

Сказав это, создав C #Класс с сериализацией, соответствующей некоторому произвольному XML, довольно сложен, я не уверен, что это правильный подход

...