C#Xml反序列化中的问题

时间:2010-11-19 05:40:10

标签: c# xml-deserialization

在我的项目中,遗留代码生成具有以下结构的xml:

<Output>
    <Template recordID=12>
        <Employer type="String">
            <Value>Google</Value>
            <Value>GigaSoft inc.</Value>
        </Employer>
        <Designation  type="String">
            <Value>Google</Value>
        </Designation>
        <Duration  type="String" />
    </Template>
</Output>

我想将此xml反序列化为具有以下属性的对象(我正在使用C#):

public class EmployerInfo
{
    string[] _employerName;
    string[] _designation;
    string _duration;
}

我尝试使用成员周围的以下属性反序列化上面的xml(注意:我已经简化了代码。我知道我们不应该公开数据成员。这段代码仅用于实验目的)

[XmlElement("Template")]
public class EmployerInfo
{
    [XmlElement("Employer")]
    public string[] _employerName;

    [XmlElement("Designation")]
    public string[] _designation;

    [XmlElement("Duration")]
    public string _duration;
}

要反序列化,在主要课程中我写道:

XmlSerializer serial = new XmlSerializer(typeof(Output));
TextReader reader = new StreamReader(@"C:\sample_xml.xml");
EmployerInfo fooBar = (EmployerInfo)serial.Deserialize(reader);
reader.Close();

执行上面的代码后,fooBar对象中的所有成员都设置为null(默认值)。我认为这是因为xml结构与类结构不匹配。

我尝试使用xsd命令自动生成类,但它为每个数据成员创建了单独的类。

我试图给出像XmlElement(“Employer.Value”),XmlElement(“Template.Employer.Value”)之类的元素名称,但这也没有用。

有人可以建议一些方法将这个xml放入EmployerInfo类吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

尝试:

using System.IO;
using System.Xml.Serialization;
[XmlType("Template")]
public class EmployerInfo
{
    [XmlArray("Employer"), XmlArrayItem("Value")]
    public string[] _employerName;

    [XmlArray("Designation"), XmlArrayItem("Value")]
    public string[] _designation;

    [XmlElement("Duration")]
    public string _duration;
}
public class Output
{
    public EmployerInfo Template { get; set; }
}
static class Program
{
    static void Main()
    {
        XmlSerializer serial = new XmlSerializer(typeof(Output));
        using (var reader = new StringReader(@"<Output>
    <Template recordID=""12"">
        <Employer type=""String"">
            <Value>Google</Value>
            <Value>GigaSoft inc.</Value>
        </Employer>
        <Designation  type=""String"">
            <Value>Google</Value>
        </Designation>
        <Duration  type=""String"" />
    </Template>
</Output>"))
        {
            EmployerInfo fooBar = ((Output)serial.Deserialize(reader)).Template;
        }
    }
}

另请注意,从XmlSerializer(typeof(Output))的反序列化方法返回的类型将是Output记录。