Вопрос класса XML в C # - PullRequest
       28

Вопрос класса XML в C #

7 голосов
/ 15 июля 2009

Может кто-нибудь, пожалуйста, помогите мне, у меня есть этот фрагмент 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; }
    } 
}

Ответы [ 7 ]

11 голосов
/ 15 июля 2009

Вы использовали XSD VS2008?

Вот вывод, который я получил:

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");
    }
}
11 голосов
/ 27 октября 2013

У вас есть две возможности.

Метод 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. Создайте XSD-файл из вашего xml-файла, набрав xsd file.xml
  4. Создать C # классы , набрав xsd /c file.xsd

И это все! Вы создали классы C # из XML-файла в C:\path\to\xml\file.cs

Метод 2 - Специальная паста

<ч /> Требуется Visual Studio 2012 +

  1. Копировать содержимое вашего XML-файла в буфер обмена
  2. Добавьте в свое решение новый пустой файл класса ( Shift + Alt + C )
  3. Откройте этот файл и в меню нажмите Edit > Paste special > Paste XML As Classes
    enter image description here

И это все!

Использование

<ч />

Использование этого вспомогательного класса очень просто:

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 Конвертеров: Нажмите

3 голосов
/ 15 июля 2009

Минимальный рабочий минимум ... похоже, вам нужно добавить только один атрибут.

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

public class DefaultSendToAddressCollectionClass
{
    [XmlElement]
    public string[] EmailAddress { get; set; }
}
3 голосов
/ 15 июля 2009

Использование .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; }
}
1 голос
/ 15 июля 2009

Этот класс будет сериализовать так, как вы хотите. Я изменил вашу пользовательскую коллекцию на List и использовал атрибут 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>();
    }
}
1 голос
/ 15 июля 2009

XSD.EXE - это инструмент, который создает классы специально для сериализации XML. Если он создает частичные классы, это потому, что они работают для сериализации XML. Это не то, что ваша проблема.

Попробуйте использовать XSD.EXE и сериализовать / десериализовать. Если вы снова получите исключение, пожалуйста, перехватите его, а затем опубликуйте результаты ex.ToString ().

0 голосов
/ 15 июля 2009

Сериализация XML требует атрибутов. Обычно я делаю это, помечая сам класс с помощью [Serializable] и [XmlRoot], затем помечая открытые свойства с помощью [XmlElement], [XmlAttribute] или [NoSerialize].

Какая у вас проблема?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...