Asp.net 运行时C#类反序列化的自定义xsd文件

Asp.net 运行时C#类反序列化的自定义xsd文件,asp.net,xsd,xsd.exe,Asp.net,Xsd,Xsd.exe,我正在尝试将xsd文件转换为.net类。 我已经搜索了很多关于这个主题的内容,发现xsd.exe是实现这个主题的方法之一,但我仍然有两个顾虑 我不想从命令提示符手动生成类,但希望所有这些都在运行时完成。为此,我尝试使用System.Diagnostics.Process在运行时运行xsd.exe,但未能成功,并且在进程启动时得到一个闪烁的命令提示窗口 我甚至没有成功地获得从命令提示符生成的类。它给了我错误“无法验证架构D:\Response.xsd” 因此,基本上我正在尝试实现一些使用xsd字符

我正在尝试将xsd文件转换为.net类。 我已经搜索了很多关于这个主题的内容,发现xsd.exe是实现这个主题的方法之一,但我仍然有两个顾虑

  • 我不想从命令提示符手动生成类,但希望所有这些都在运行时完成。为此,我尝试使用System.Diagnostics.Process在运行时运行xsd.exe,但未能成功,并且在进程启动时得到一个闪烁的命令提示窗口

  • 我甚至没有成功地获得从命令提示符生成的类。它给了我错误“无法验证架构D:\Response.xsd”

  • 因此,基本上我正在尝试实现一些使用xsd字符串的东西,并在运行时将其反序列化为类的一种类型,就像使用XmlSerializer类处理Xml字符串一样

    我想提到的是,我认为我的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文档(1,2)中有错误 我尝试更改xml字符串中的许多内容,但未能成功


    任何帮助都是值得的

    使用XDocument反序列化我的xml找到了一种非常得体且简单的方法!!!!:):)

    我现在是这样做的

    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>
    
    
    成功
    备份
    5e9733eb9efeb02d80aa0551ef7e9ccd
    WebExXMLAPIv3.9.0
    
    这不是XSD,这只是xml响应。@rene Oops!好啊你能给我举个例子,说明我如何为这个结构设计一个类吗。我没有得到什么应该是类名,什么应该是这个结构的属性名等。谢谢我假设您已经获得了响应来自的端点的wsdl?这会让生活更轻松。我刚刚用xsd.exe做了一些尝试。我使用我的xml为它生成xsd文件,它正确地生成了它,然后我尝试从那个xsd文件生成类。我认为它现在正在正确地解析它,但是现在得到了一个不同的错误,“元素“”丢失了。”从xml实例推断XSD并不总是能给出您要查找的确切XSD。您希望将其定义为端点契约的一部分(作为WSDL的一部分发布)。
    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);
    
    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 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>