将XML字符串反序列化为复杂类型

eth*_*th0 2 c# xml deserialization

我的Xml(我无法改变):

<result>
    <type>MAZDA</type>
    <make>RX-8</type>
    <country>JAPAN</country>
</result>
Run Code Online (Sandbox Code Playgroud)

我的模特:

[Serializable, XmlRoot("result")]
public class VehicleDetails
{
    public string Type { get; set; }
    public string Make { get; set; }
    public string Country { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

反序列化此XML按预期工作,但我想将Country属性更改为复杂类型,如下所示:

public Country Country { get; set; }
Run Code Online (Sandbox Code Playgroud)

并把国名,"JAPAN",在Country.Name财产,任何想法?

Dar*_*rov 7

你可以使用如下属性来装饰Name你的Country类的[XmlText]属性:

[XmlRoot("result")]
public class VehicleDetails
{
    public string Type { get; set; }
    public string Make { get; set; }
    public Country Country { get; set; }
}

public class Country
{
    [XmlText]
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

还要注意我已经摆脱了[Serializable]属性.它对XML序列化没用.此属性用于二进制/远程处理序列化.

这是一个完整的例子,将按JAPAN预期打印:

using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

[XmlRoot("result")]
public class VehicleDetails
{
    public string Type { get; set; }
    public string Make { get; set; }
    public Country Country { get; set; }
}

public class Country
{
    [XmlText]
    public string Name { get; set; }
}

class Program
{
    static void Main()
    {
        var serializer = new XmlSerializer(typeof(VehicleDetails));
        var xml = 
        @"<result>
            <Type>MAZDA</Type>
            <Make>RX-8</Make>
            <Country>JAPAN</Country>
        </result>";
        using (var reader = new StringReader(xml))
        using (var xmlReader = XmlReader.Create(reader))
        {
            var result = (VehicleDetails)serializer.Deserialize(xmlReader);
            Console.WriteLine(result.Country.Name);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)