десериализовать существующий xml в пользовательский объект

У меня есть следующий xml:

<state>
<groups>
    <group id='1' name='Basic Search Options'>
        <control name='Building' label='In' display='true' configurable='false'/>
        <control name='SearchType' label='For' display='true' configurable='false'/>
        <control id='1' default='C' name='Search By' label='By'>
            <option searchtype='C' searchmode='Cnumber' value='CNumber' label='C Number' display='true'/>
            <option searchtype='C' searchmode='crossrefnumber' value='CNumber1' label='Cross Reference Number' display='true'/>
            <option searchtype='P' searchmode=''  value='CaseNumber' label='P Name' display='true'/>
            <option searchtype='P' searchmode='' value='CaseNumber' label='A Name' display='false'/>
        </control>
    </group>
    <group id='2' name='Advanced Search Options'>
        <control name='Ctatus' label='C Status' display='true'/>
        <control name='DateFiled' label='Date Filed' display='true'/>
    </group>
</groups>

How would I de-serialize this into the following object? I dont want my xml to have the following tags "ArrayofGroup", instead the xml should have custom tags like mention above.

public class GroupOfControls
{
public int instanceId { get; set; }
public int GroupId { get; set; }
public string Name { get; set; }
public List<SearchControl> Group { get; set; }
}

public class SearchControl
{
public string Name { get; set; }
public string Label { get; set; }
public bool Display { get; set; }
public string Default { get; set; }
public List<SearchOption> SearchOptions { get; set; }
}

public class SearchOption
{
public string Value { get; set; }
public string Label { get; set; }
public bool Display { get; set; }
public string SearchMode { get; set; }
public string SearchType { get; set; }
}
}

person Vijay V    schedule 09.07.2012    source источник
comment
У вас есть файл XSD для XML? Я предполагаю, что вы используете С#, но какую версию? Также какая версия .Net?   -  person JMK    schedule 09.07.2012
comment
VS C# 2010 и версия .Net: 4.0 — у меня нет файла XSD.   -  person Vijay V    schedule 09.07.2012


Ответы (1)


Если у вас нет XSD-файла, вам нужно создать его из XML-файла. Вы можете сделать это с помощью командной строки Visual Studio, используя следующую команду:

xsd myfilename.xml

Если у вас есть файл XSD, это должно быть достаточно просто.

Я работаю с Visual Studio 2010 (С#/.Net 4), и я бы сделал это:

Сначала я бы сделал новое решение в Visual Studio:

Новый проект

Затем вам нужно импортировать XSD-файл в свой проект, щелкнув правой кнопкой мыши свое решение, выбрав Add => Existing Item и перейдя к XSD.

Когда у вас есть XSD внутри вашего проекта, вам нужно запустить командную строку Visual Studio, использовать cd для перехода в каталог ваших проектов, а затем ввести следующую команду:

xsd myFilename.xsd /classes

Это генерирует класс C#, в который вы собираетесь десериализовать свой XML. Используйте диалоговое окно Add Existing Item, чтобы импортировать этот новый класс в свое решение.

Затем вы добавляете using System.Xml.Serialization; и using System.IO; к своим операторам использования. Затем используйте следующий код для десериализации вашего XML в объект (при условии, что XML проверяется на соответствие вашему XSD). Самый последний файл XSD, который я смог найти, я назвал ResponseData, как показано ниже:

SolutionExplorer

Имея это в виду, мой код С# ниже:

using System;
using System.IO;
using System.Xml.Serialization;

namespace XML_Deserialization
{
    class Program
    {
        static void Main(string[] args)
        {
            ResponseData myResponseData = new ResponseData();

            XmlSerializer mySerializer = new XmlSerializer(typeof(ResponseData));
            StreamReader myStreamReader = new StreamReader(@"C:\Users\JMK\Documents\Visual Studio 2010\Projects\scratch\XML Deserialization\XML Deserialization\text.xml");
            myResponseData = (ResponseData)mySerializer.Deserialize(myStreamReader);

            Console.ReadLine();
        }
    }
}
person JMK    schedule 09.07.2012
comment
Почти уверен, что вам не нужно делать ResponseData myResponseData = new ResponseDate(); Просто ResponseData myResponseData = (ResponseData)mySerializer.Deserialize(myStreamReader); - person Glimpse; 19.09.2013