2011-12-26 20 views
0

xsdファイルを.netクラスに変換しようとしています。 私は手動で、コマンドプロンプトからクラスを生成したくないこのトピックのために多くのことを検索し、それを達成する方法の一つとして、Xsd.exeでは見つけましたが、私はまだ2つの懸念ランタイム時のC#クラスへのカスタムxsdファイルの逆シリアル化

  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

これは、この単なるXML応答に、XSDではありませんあなたがここに私のxmlをお見せしましょう。 – rene

+0

@reneよろしく! OK。ですから、この構造のクラスをどのように設計するかの例を教えてください。私はクラス名でなければならないものを取得していない、この構造のプロパティ名などが必要です。ありがとう! –

+1

私はあなたが応答が来ているエンドポイントのwsdlを持っていると思いますか?それは人生を楽にするでしょう。 – rene

答えて

0

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 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> 
関連する問題