XML到C#类问题(XML to C# Class Question)

2019-06-26 01:08发布

是否有人可以帮助我,我有这样的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; }
    } 
}

Answer 1:

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

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

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


Answer 2:

你使用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");
    }
}


Answer 3:

你有两种可能性。

方法1. XSD工具


假设你在这个位置你的XML文件C:\path\to\xml\file.xml

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

就是这样! 您已经生成的XML文件的C#类在C:\path\to\xml\file.cs

方法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转换器: 点击



Answer 4:

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


Answer 5:

XSD.EXE是专门为XML序列化的目的产生类工具。 如果它产生局部类,那是因为他们为XML序列化工作。 这不是你的问题是什么。

尝试使用XSD.EXE和序列化/反序列化。 如果再次得到一个异常,那么请抓住它,然后张贴ex.ToString的结果()。



Answer 6:

这个类将序列化,你想要的方式。 我改变了你的自定义集合到一个列表并使用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>();
    }
}


Answer 7:

XML序列化需要的属性。 我通常做它的方式是标志类本身与[Serializable接口]和[XmlRoot],然后标记了无论是[XmlElement的]公共属性,[XmlAttribute]或[NoSerialize。

有什么具体的问题,你有?



文章来源: XML to C# Class Question
标签: c# xml class