Десериализация пользовательских файлов xsd в C # классы во время выполнения - PullRequest
0 голосов
/ 26 декабря 2011

Я пытаюсь преобразовать файл xsd в класс .net.Я много искал эту тему и нашел xsd.exe как один из способов достижения этой цели, но у меня все еще есть две проблемы

  1. Я не хочу создавать классы вручнуюиз командной строки, но хотите, чтобы все это было сделано во время выполнения.Для этого я попытался использовать System.Diagnostics.Process для запуска xsd.exe во время выполнения, но не смог добиться успеха, а также получал мигающее окно командной строки при запуске процесса.

  2. Я дажеНе удалось получить классы, сгенерированные из командной строки.Это выдает мне ошибку: «Схема D: \ Response.xsd не может быть проверена».

Поэтому в основном я пытаюсь реализовать что-то, что будет использовать мою строку xsd и десериализовать ее в однутипа моего класса во время выполнения, что-то вроде того, что мы делаем со строкой Xml, используя класс XmlSerializer.

Я хотел бы упомянуть, что я думаю, что моя строка xsd не относится к общим типам xsd, а является своего рода пользовательским, напримеродин из ответов:

<?xml version="1.0" encoding="iso-8859-1"?>
<serv:message xmlns:serv="http://www.webex.com/schemas/2002/06/service"
xmlns:com="http://www.webex.com/schemas/2002/06/common"
xmlns:use="http://www.webex.com/schemas/2002/06/service/user">
    <serv:header>
        <serv:response>
            <serv:result>SUCCESS</serv:result>
            <serv:gsbStatus>BACKUP</serv:gsbStatus>
        </serv:response>
    </serv:header>
    <serv:body>
        <serv:bodyContent xsi:type="use:getLoginTicketResponse"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <use:ticket>5e9733eb9efeb02d80aa0551ef7e9ccd</use:ticket>
            <use:apiVersion>WebEx XML API V3.9.0</use:apiVersion>
        </serv:bodyContent>
    </serv:body>
</serv:message>

Редактировать - мне удалось создать файл класса для моего xml сейчас, и вот он

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.webex.com/schemas/2002/06/service/user")]
public partial class getLoginTicketResponse : bodyContentType
{

    private string ticketField;

    private string apiVersionField;

    /// <remarks/>
    public string ticket
    {
        get
        {
            return this.ticketField;
        }
        set
        {
            this.ticketField = value;
        }
    }

    /// <remarks/>
    public string apiVersion
    {
        get
        {
            return this.apiVersionField;
        }
        set
        {
            this.apiVersionField = value;
        }
    }
}

Иэто bodyContentType

/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(getLoginTicketResponse))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.webex.com/schemas/2002/06/service")]
[System.Xml.Serialization.XmlRootAttribute("getLoginTicket", Namespace = "http://www.webex.com/schemas/2002/06/service/user", IsNullable = false)]
public partial class bodyContentType
{
}

Теперь попробуйте сериализовать его следующим образом

var nameSpaceManager = new XmlNamespaceManager(responseXML.NameTable);
nameSpaceManager.AddNamespace("serv", "http://www.webex.com/schemas/2002/06/service");
nameSpaceManager.AddNamespace("com", "http://www.webex.com/schemas/2002/06/common");
nameSpaceManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
nameSpaceManager.AddNamespace("meet", "http://www.webex.com/schemas/2002/06/service/meeting");
nameSpaceManager.AddNamespace("att", "http://www.webex.com/schemas/2002/06/service/attendee");
nameSpaceManager.AddNamespace("use", "http://www.webex.com/schemas/2002/06/service/user");

XmlNode statusNode = responseXML.SelectSingleNode("/serv:message/serv:body", nameSpaceManager);
TextReader reader = new StringReader(s);
XmlSerializer serializer = new XmlSerializer(typeof(getLoginTicketResponse));

var obj = serializer.Deserialize(reader);

Но продолжайте получать сообщение об ошибке «В XML-документе (1, 2) есть ошибка».Я пытался изменить многие вещи в строке XML, но не смог добиться успеха

Любая помощь будет заметна!

1 Ответ

0 голосов
/ 28 декабря 2011

Получил очень приличный и простой подход для десериализации моего xml с использованием XDocument !!!! :):)

Вот как я это делаю сейчас

var xDoc = XDocument.Parse(xmlString);
XNamespace userNS = "http://www.webex.com/schemas/2002/06/service/user";
XNamespace servNS = "http://www.webex.com/schemas/2002/06/service";
var re = from rssItem in xDoc.Descendants(servNS + "bodyContent")
                 let elementTicket = rssItem.Element(userNS + "ticket")
                 let elementApiVersion = rssItem.Element(userNS + "apiVersion")
                 where (elementTicket != null && elementApiVersion != null)
                 select new getLoginTicketResponse()
                 {
                     ticket = elementTicket.Value,
                     apiVersion = elementApiVersion.Value
                 };

getLoginTicketResponse loginTicketResponse = re.First();

И я получаю десериализацию моего объекта класса непосредственно из xml, без XSD ничего не требуется !

Позвольте мне снова показать вам мой xml

<?xml version="1.0" encoding="iso-8859-1"?>
<serv:message xmlns:serv="http://www.webex.com/schemas/2002/06/service"
xmlns:com="http://www.webex.com/schemas/2002/06/common"
xmlns:use="http://www.webex.com/schemas/2002/06/service/user">
    <serv:header>
        <serv:response>
            <serv:result>SUCCESS</serv:result>
            <serv:gsbStatus>BACKUP</serv:gsbStatus>
        </serv:response>
    </serv:header>
    <serv:body>
        <serv:bodyContent xsi:type="use:getLoginTicketResponse"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <use:ticket>5e9733eb9efeb02d80aa0551ef7e9ccd</use:ticket>
            <use:apiVersion>WebEx XML API V3.9.0</use:apiVersion>
        </serv:bodyContent>
    </serv:body>
</serv:message>
...