繁体   English   中英

XML到C#的类问题

[英]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");
    }
}

您有两种可能性。

方法1。XSD工具


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

  1. 打开开发人员命令提示符
    您可以在Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools找到它,或者如果您使用Windows 8,只需在开始屏幕中输入开发人员命令提示符
  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<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM