2

在我的项目中,遗留代码生成具有以下结构的 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类中吗?

提前致谢

4

1 回答 1

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记录。

于 2010-11-19T05:44:17.453 回答