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")のような要素名を付けようとしましたが、これも機能しませんでした。

EmployerInfo誰かがこのxmlをクラスに適合させる方法を提案できますか?

前もって感謝します

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))また、のdeserializeメソッドから返されるタイプがOutputレコードになることにも注意してください。

于 2010-11-19T05:44:17.453 に答える