XML到C#类问题

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

  123  email@whereEver.com   

我想从中创建一个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; } } } 

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

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

你使用过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; ///  [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. XSD工具


假设您的XML文件位于此位置C:\path\to\xml\file.xml

  1. 打开开发人员命令提示符
    您可以在“ Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools找到它。或者,如果您有Windows 8,则可以在“ 开始”屏幕中键入Developer Command Prompt
  2. 通过键入cd /D "C:\path\to\xml"位置更改为XML文件目录
  3. 通过键入xsd file.xml从xml文件创建XSD文件
  4. 键入xsd /c file.xsd创建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
    在此处输入图像描述

就是这样!

用法


这个助手类的用法非常简单:

 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(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(this string @this) where T : class { return JSON.Deserialize(@this.Trim()); } } } 

你现在要做的就是:

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

这里有一些在线XML <--> JSON转换器: 点击

使用.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; } } 

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

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

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

 [Serializable] public class EmailConfiguration { private string dataBoxID; public string DataBoxID { get { return dataBoxID; } set { dataBoxID = value; } } private List defaultSendToAddressCollection; [XmlArrayItem("EmailAddress")] public List DefaultSendToAddressCollection { get { return defaultSendToAddressCollection; } set { defaultSendToAddressCollection = value; } } public EmailConfiguration() { DefaultSendToAddressCollection = new List(); } } 

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

你有什么具体问题?