2011-12-26 29 views
0

我想將xsd文件轉換爲.net類。 我尋覓了很多關於這個話題,發現XSD.EXE作爲實現這一目標的方式之一,但我仍然有兩個問題在運行時自定義xsd文件到C#類的反序列化

  1. 我不想手動生成從命令提示符類,但希望所有這些在運行時完成。爲此,我嘗試使用System.Diagnostics.Process在運行時運行xsd.exe,但無法成功執行,並且在進程啓動時出現閃爍的命令提示符窗口。

  2. 我甚至沒有成功獲得從命令提示符生成的類也。它給我錯誤「Schema 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類文件,並在這裏它是

/// <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

現在

,試圖序列像這樣

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字符串中的許多東西,但無法取得成功

任何幫助將是可觀的!

+0

這不是一個XSD,這只是對XML響應。 – rene 2011-12-26 12:39:31

+0

@哎呀!好。那麼你能否給我舉一個例子,我怎樣才能爲這個結構設計一個類。我沒有得到什麼應該是類名,什麼應該是這個結構的屬性名稱等。謝謝! – 2011-12-26 12:52:48

+1

我假設你已經得到了終端響應來自的WSDL?這會讓生活更輕鬆。 – rene 2011-12-26 13:01:45

回答

0

得到了一個非常體面和簡單的方法來反序列化我的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> 
相關問題