Pregunta

En mi proyecto, el código heredado genera XML que tiene la estructura siguiente:

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

Quiero deserializar este XML en objeto que tiene las siguientes propiedades ( estoy usando C # ):

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

He intentado deserializar por encima de XML utilizando siguientes atributos alrededor de los miembros (NOTA:.. He simplificado código Sé que no hay que hacer que los miembros de datos públicos Este código es sólo para fines experimentales)

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

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

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

Para deserializar, en la clase principal que escribí:

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

Después de ejecutar código anterior, todos los miembros de objeto FooBar se establecen en NULL (valores por defecto). Creo que esto se debe a que la estructura XML no coincide con la estructura de clases.

He intentado generar automáticamente la clase usando el comando xsd pero creó clases separadas para cada uno del miembro de datos.

He intentado dar nombres de elementos como XmlElement ( "Employer.Value"), XmlElement ( "Template.Employer.Value"), pero esto aún no ha trabajo también.

Puede alguien por favor sugerir alguna forma para adaptarse a este XML en una clase EmployerInfo?

Gracias de antemano

¿Fue útil?

Solución

Trate:

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

Tenga en cuenta también que el tipo de regresar de deserializar método de XmlSerializer(typeof(Output)) va a ser un registro Output.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top