2013-06-05 42 views
1

生成使用類我有這個XML文件:如何通過XSD

<?xml version="1.0" encoding="us-ascii"?> 
<body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <header><user>BOBBY</user></header> 
    <in> 
     <customer></customer> 
    </in> 
    <out> 
     <cmd> 
      <productid></productid> 
      <price></price> 
      <date></date> 
      <state></state> 
      <type></type> 
     </cmd> 
     <cmd> 
      <productid></productid> 
      <price></price> 
      <date></date> 
      <state></state> 
      <type></type> 
     </cmd> 
    </out> 
    <state> 
     <code></code> 
     <desc></desc> 
    </state> 
</body> 

而且XSD.EXE生成這個類:

namespace System.autoGenerated { 
    using System.Xml.Serialization; 


    /// <remarks/> 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
    [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
    public partial class body : object, System.ComponentModel.INotifyPropertyChanged { 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute("header", typeof(bodyHeader), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     [System.Xml.Serialization.XmlElementAttribute("in", typeof(bodyIN), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     [System.Xml.Serialization.XmlElementAttribute("out", typeof(bodyOut), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     [System.Xml.Serialization.XmlElementAttribute("state", typeof(bodyState), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     public object[] Items; 

     public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

     protected void RaisePropertyChanged(string propertyName) { 
      System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
      if ((propertyChanged != null)) { 
       propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

    /// <remarks/> 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
    public partial class bodyHeader : object, System.ComponentModel.INotifyPropertyChanged { 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     public string user; 

     public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

     protected void RaisePropertyChanged(string propertyName) { 
      System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
      if ((propertyChanged != null)) { 
       propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

    /// <remarks/> 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
    public partial class bodyIN : object, System.ComponentModel.INotifyPropertyChanged { 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     public string customer; 

     public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

     protected void RaisePropertyChanged(string propertyName) { 
      System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
      if ((propertyChanged != null)) { 
       propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

    /// <remarks/> 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
    public partial class bodyOut : object, System.ComponentModel.INotifyPropertyChanged { 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute("cmd", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     public bodyOutCmd[] cmd; 

     public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

     protected void RaisePropertyChanged(string propertyName) { 
      System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
      if ((propertyChanged != null)) { 
       propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

    /// <remarks/> 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
    public partial class bodyOutCmd : object, System.ComponentModel.INotifyPropertyChanged { 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     public string productid; 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     public string price; 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     public string date; 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     public string state; 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     public string type; 

     public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

     protected void RaisePropertyChanged(string propertyName) { 
      System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
      if ((propertyChanged != null)) { 
       propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

    /// <remarks/> 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
    public partial class bodyState : object, System.ComponentModel.INotifyPropertyChanged { 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     public string code; 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     public string desc; 

     public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

     protected void RaisePropertyChanged(string propertyName) { 
      System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
      if ((propertyChanged != null)) { 
       propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 
} 

如何使用這個文件?我不明白如何在擴展類中使用它來使用這個部分類。

我的目標是序列化和反序列化和對象。 ---------------------------------- UPDATE -------------- --------------

我已經創建了這個測試代碼: using System; 使用DAL.XML.PDD.PDDORDM001; using System.Xml.Serialization;使用System.IO的 ;

namespace Tests 
{ 
    class Serialize 
    { 
     public static void Main() 
     { 
      Console.WriteLine("Go..."); 

      XmlSerializer serializer = new XmlSerializer(typeof(body)); 
      TextWriter writer = new StreamWriter(@"c:\file.xml"); 
      body test = null; 
      serializer.Serialize(writer, test); 
      writer.Close(); 

     } 
    } 
} 

但它給我這樣的結果:

<?xml version="1.0" encoding="utf-8"?> 
<body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 

回答

1

您需要使用XmlSerializer的序列化對象和反序列化XML:

using (var stream = new FileStream(xmlFilePath)) 
{ 
    var serializer = new XmlSerializer(typeof(body)); 
    var body = (body) serializer.Deserialize(stream); 
} 
+0

我已經更新我的問題。 – Portekoi

+0

你期待什麼結果?你正在序列化null。 – alex

+0

一個空的xml文件..如何爲我的xml文件添加其他部分? – Portekoi

0

你可能想使用DataContractSerializer類。下面是它的文檔,稍加修改,以適應您的使用情況爲例:

public static body ReadObject(string fileName) 
{ 
    Console.WriteLine("Deserializing an instance of the object."); 
    FileStream fs = new FileStream(fileName, 
    FileMode.Open); 
    XmlDictionaryReader reader = 
     XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas()); 
    DataContractSerializer ser = new DataContractSerializer(typeof(body)); 

    // Deserialize the data and read it from the instance. 
    body deserializedBody = (body)ser.ReadObject(reader, true); 
    reader.Close(); 
    fs.Close(); 
    return deserializedBody; 
} 

另一種選擇是XmlSerializer類。

1

解決方案:我有修改XML類:

[System.Xml.Serialization.XmlElementAttribute("Header", typeof(BodyHeader), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    [System.Xml.Serialization.XmlElementAttribute("In", typeof(BodyIn), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    [System.Xml.Serialization.XmlElementAttribute("State", typeof(BodyState), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    [System.Xml.Serialization.XmlElementAttribute("Out", typeof(BodyOut), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public object[] Items; 

通過

[System.Xml.Serialization.XmlElementAttribute("Header", typeof(BodyHeader), Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public BodyHeader header; 

    [System.Xml.Serialization.XmlElementAttribute("In", typeof(BodyIn), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public In in; 

    [System.Xml.Serialization.XmlElementAttribute("State", typeof(BodyState), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public BodyState state; 

    [System.Xml.Serialization.XmlElementAttribute("Out", typeof(BodyOut), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public BodyOut out; 

而且我的測試代碼替換:

using System; 
using DAL.XML.PDD.PDDORDM001; 
using System.Xml.Serialization; 
using System.IO; 

namespace Tests 
{ 
    class Serialize 
    { 
     public static void Main() 
     { 
      Console.WriteLine("Serialisation..."); 


      XmlSerializer serializer = new XmlSerializer(typeof(DAL.XML.PDD.PDDORDM001.Body)); 
      TextWriter writer = new StreamWriter(@"c:\file.xml"); 
      DAL.XML.PDD.PDDORDM001.Bodytest = new DAL.XML.PDD.PDDORDM001.Body(); 

      test.header= new BodyHeader(); 
      test.header.action = "LEC"; 
      test.header.user = "BOBBY"; 

      test.in= new BodyIn(); 
      test.in.customer= "07251005502"; 

      serializer.Serialize(writer, test); 
      writer.Close(); 

     } 
    } 
}