是否有人可以帮助我,我有这样的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; }
}
}
最低限度的工作......看起来像你只需要添加一个属性。
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;
/// <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. XSD工具
假设你在这个位置你的XML文件
C:\path\to\xml\file.xml
- 开放开发命令提示符
你可以找到它在Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools
或者,如果您有Windows 8可以只启动开始屏幕中键入开发商命令提示符 - 更改位置将XML文件目录键入
cd /D "C:\path\to\xml"
- 通过键入创建一个从XML文件XSD文件
xsd file.xml
- 通过键入创建C#类
xsd /c file.xsd
就是这样! 您已经生成的XML文件的C#类在C:\path\to\xml\file.cs
方法2 - 选择性粘贴
所需的Visual Studio 2012+
- 您的XML文件的内容复制到剪贴板
- 添加到您的解决方案新的,空的类文件( 按住Shift + Alt + 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; }
}
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。
有什么具体的问题,你有?