[英]XML to C# Class Question
有人可以帮我吗,我有这个xml片段
<?xml version="1.0" encoding="utf-8" ?>
<EmailConfiguration>
<DataBoxID>123</DataBoxID>
<DefaultSendToAddressCollection>
<EmailAddress>email@whereEver.com</EmailAddress>
</DefaultSendToAddressCollection>
</EmailConfiguration>
我想从中创建一个对应的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; }
}
}
您是否使用了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");
}
}
您有两种可能性。
C:\\path\\to\\xml\\file.xml
Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools
找到它,或者如果您使用Windows 8,只需在开始屏幕中输入开发人员命令提示符 cd /D "C:\\path\\to\\xml"
,将位置更改为XML文件目录。 xsd file.xml
从xml文件创建XSD文件 xsd /c file.xsd
创建C#类 就是这样! 您已经从C:\\path\\to\\xml\\file.cs
xml文件生成了C#类
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<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
转换器: 单击
使用.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; }
}
最低限度的工作要求...看起来只需要添加一个属性。
public class EmailConfiguration
{
public string DataBoxID { get; set; }
public DefaultSendToAddressCollectionClass DefaultSendToAddressCollection { get; set; }
}
public class DefaultSendToAddressCollectionClass
{
[XmlElement]
public string[] EmailAddress { get; set; }
}
XSD.EXE是专门为XML序列化目的生成类的工具。 如果产生部分类,那是因为它们适用于XML序列化。 那不是你的问题。
尝试使用XSD.EXE并进行序列化/反序列化。 如果再次遇到异常,请捕获该异常,然后发布ex.ToString()的结果。
此类将序列化您想要的方式。 我将您的自定义集合更改为列表,并使用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>();
}
}
XML序列化需要属性。 我通常这样做的方法是使用[Serializable]和[XmlRoot]标记类本身,然后使用[XmlElement],[XmlAttribute]或[NoSerialize]标记公共属性。
您有什么具体问题?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.