XML到C#类问题

时间:2009-07-15 18:11:43

标签: c# xml class

有人可以帮助我,我有这个xml片段

<?xml version="1.0" encoding="utf-8" ?>
<EmailConfiguration>
  <DataBoxID>123</DataBoxID>
  <DefaultSendToAddressCollection>
     <EmailAddress>email@whereEver.com</EmailAddress>
  </DefaultSendToAddressCollection>
</EmailConfiguration>

我想从中创建一个corressponding c#类。在您说“只使用xsd.exe”之前,Xsd的输出无法序列化和反序列化正确,因为它使用部分类生成类。

请你能告诉我如何创建这个类....这是我采取的方法,但它不起作用。

public class EmailConfiguration
{
    private string dataBoxID;

    public string DataBoxID
    {
        get { return dataBoxID; }
        set { dataBoxID = value; }
    }

    private DefaultSendToAddressCollectionClass defaultSendToAddressCollection;

    public DefaultSendToAddressCollectionClass DefaultSendToAddressCollection
    {
        get { return defaultSendToAddressCollection; }
        set { defaultSendToAddressCollection = value; }
    }
}

这是子类的类声明

public class DefaultSendToAddressCollectionClass
{
    private string[] emailAddress;
    public string[] EmailAddress
    {
        get { return emailAddress; }
        set { emailAddress = value; }
    } 
}

7 个答案:

答案 0 :(得分:11)

您使用的是VS2008的XSD吗?

这是我得到的输出:

c:>xsd email.xml
Writing file 'c:\email.xsd'

c:>xsd email.xsd /c /edb
Writing file 'c:\email.cs'

生成可序列化的输出:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[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 EmailConfiguration : object,  System.ComponentModel.INotifyPropertyChanged {

private string dataBoxIDField;

private EmailConfigurationDefaultSendToAddressCollection[] defaultSendToAddressCollectionField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string DataBoxID {
    get {
        return this.dataBoxIDField;
    }
    set {
        this.dataBoxIDField = value;
        this.RaisePropertyChanged("DataBoxID");
    }
}

答案 1 :(得分:11)

你有两种可能性。

方法1. XSD 工具

<小时/> 假设您的XML文件位于此位置C:\path\to\xml\file.xml

  1. 打开开发人员命令提示
    你可以在Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools找到它 或者如果您有Windows 8,只需在开始屏幕
  2. 中键入开发人员命令提示符即可
  3. 通过键入cd /D "C:\path\to\xml"
  4. 将位置更改为XML文件目录
  5. 通过键入xsd file.xml
  6. 从您的xml文件创建 XSD文件
  7. 输入xsd /c file.xsd
  8. 创建 C#类

    就是这样!您已在C:\path\to\xml\file.cs

    中的xml文件中生成了C#类

    方法2 - 粘贴特殊

    <小时/> 必需的Visual Studio 2012 +

    1. 将XML文件的内容复制到剪贴板
    2. 向您的解决方案添加新的空类文件( Shift + Alt + C
    3. 打开该文件,然后在菜单中点击Edit > Paste special > Paste XML As Classes
      enter image description here
    4. 就是这样!

      用法


      使用此助手类非常简单:

      using System;
      using System.IO;
      using System.Web.Script.Serialization; // Add reference: System.Web.Extensions
      using System.Xml;
      using System.Xml.Serialization;
      
      namespace Helpers
      {
          internal static class ParseHelpers
          {
              private static JavaScriptSerializer json;
              private static JavaScriptSerializer JSON { get { return json ?? (json = new JavaScriptSerializer()); } }
      
              public static Stream ToStream(this string @this)
              {
                  var stream = new MemoryStream();
                  var writer = new StreamWriter(stream);
                  writer.Write(@this);
                  writer.Flush();
                  stream.Position = 0;
                  return stream;
              }
      
      
              public static T ParseXML<T>(this string @this) where T : class
              {
                  var reader = XmlReader.Create(@this.Trim().ToStream(), new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document });
                  return new XmlSerializer(typeof(T)).Deserialize(reader) as T;
              }
      
              public static T ParseJSON<T>(this string @this) where T : class
              {
                  return JSON.Deserialize<T>(@this.Trim());
              }
          }
      }
      

      现在你所要做的就是:

          public class JSONRoot
          {
              public catalog catalog { get; set; }
          }
          // ...
      
          string xml = File.ReadAllText(@"D:\file.xml");
          var catalog1 = xml.ParseXML<catalog>();
      
          string json = File.ReadAllText(@"D:\file.json");
          var catalog2 = json.ParseJSON<JSONRoot>();
      

      此处您有一些在线XML <--> JSON转换器:Click

答案 2 :(得分:3)

使用.NET 3.5:

[XmlRoot]
public class EmailConfiguration
{
    [XmlElement]
    public string DataBoxID { get; set; }

    [XmlElement]
    public DefaultSendToAddressCollectionClass DefaultSendToAddressCollection { get; set; }
}

public class DefaultSendToAddressCollectionClass
{
    [XmlElement]
    public string[] EmailAddress { get; set; }
}

答案 3 :(得分:3)

裸露的最低工作......看起来你只需要添加一个属性。

public class EmailConfiguration
{
    public string DataBoxID { get; set; }
    public DefaultSendToAddressCollectionClass DefaultSendToAddressCollection { get; set; }
}

public class DefaultSendToAddressCollectionClass
{
    [XmlElement]
    public string[] EmailAddress { get; set; }
}

答案 4 :(得分:1)

XSD.EXE是专门为XML序列化生成类的工具。如果它产生部分类,那是因为它们适用于XML序列化。这不是你的问题所在。

尝试使用XSD.EXE并序列化/反序列化。如果再次获得异常,请抓住它,然后发布ex.ToString()的结果。

答案 5 :(得分:1)

此课程将按您希望的方式序列化。我将自定义集合更改为List,并使用XmlArrayItem属性指定每个电子邮件地址的序列化方式。有许多这样的属性可以帮助您微调序列化过程。

[Serializable]
public class EmailConfiguration {
    private string dataBoxID;
    public string DataBoxID {
        get { return dataBoxID; }
        set { dataBoxID = value; }
    }

    private List<string> defaultSendToAddressCollection;

    [XmlArrayItem("EmailAddress")]
    public List<string> DefaultSendToAddressCollection {
        get { return defaultSendToAddressCollection; }
        set { defaultSendToAddressCollection = value; }
    }

    public EmailConfiguration() {
        DefaultSendToAddressCollection = new List<string>();
    }
}

答案 6 :(得分:0)

XML序列化需要属性。我通常这样做的方法是用[Serializable]和[XmlRoot]标记类本身,然后用[XmlElement],[XmlAttribute]或[NoSerialize]标记公共属性。

你有什么具体问题?