将现有xml反序列化为自定义对象

时间:2012-07-09 15:32:28

标签: deserialization xmlserializer xml-deserialization

我有以下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>

我如何将其反序列化为以下对象?我不希望我的xml有以下标签“ArrayofGroup”,而xml应该有自定义标签,如上所述。

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; }
}
}

1 个答案:

答案 0 :(得分:2)

如果您没有XSD文件,则需要从XML创建一个。您可以使用以下命令使用Visual Studio命令行执行此操作:

xsd myfilename.xml

一旦你有了一个XSD文件,这应该很容易。

我正在使用Visual Studio 2010(C#/。Net 4),我会这样做:

首先,我将在Visual Studio中创建一个新的解决方案:

New Project

然后,您需要通过右键单击解决方案,然后选择Add => Existing Item并浏览到XSD,将XSD文件导入到项目中。

在项目中安装XSD后,需要启动Visual Studio命令提示符,使用cd导航到项目目录,然后键入以下命令:

xsd myFilename.xsd /classes

这将生成您要将XML反序列化的C#类。使用Add Existing Item对话框将此新类导入您的解决方案。

接下来,将using System.Xml.Serialization;using System.IO;添加到您的using语句中。然后使用以下代码将XML反序列化为对象(假设XML针对您的XSD进行验证)。我可以提交最新的XSD,我打电话给ResponseData,如下所示:

SolutionExplorer

考虑到这一点,我的C#代码如下:

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();
        }
    }
}