如何使用不同的标签名称但相同的子标签反序列化 XML?

How to deserialize XML with the different tag names but the same subtags?

我有以下 XML:

<Vehicle>
      <Type>
        <ISN>213123214</ISN>
        <Name>ddsd</Name>
      </Type>
      <RegNo>1234</RegNo>
      <Mark>
        <ISN>423434234</ISN>
        <Name>asdasd</Name>
      </Mark>
      <Model>
        <ISN>434234324324</ISN>
        <Name>asddsa</Name>
      </Model>
      <EstimatedPrice>
        <Amount>15000</Amount>
        <AmountPrev />
        <Currency>
          <Code>R</Code>
          <Name>RU</Name>
        </Currency>
      </EstimatedPrice>
</Vehicle>

好吧,我正在尝试使用 C# 将其反序列化为目标对象。 这是我的目标 class:

public class Vehicle {
    [XmlElement("Type")]
    public Type Type { get; set; }
    [XmlElement("Mark")]
    public Mark Brand { get; set; }
    [XmlElement("Model")]
    public Mark Brand { get; set; }
    [XmlElement("EstimatedPrice")]
    public Estimation Estimation { get; set; }
}

问题是如何正确反序列化属性Mark、Model和Type?现在我得到的是空对象而不是数据。我试图将 "Vehicle" 指定为该子 classes 的根标记,但它没有效果。

P.S。 类 标记、型号和类型源自基础 class:

[Serializable]
public class ResponseItem
{
        [XmlElement("ISN")]
        string ISN { get; set; }
        [XmlElement("Name")]
        string Name { get; set; }
}

为了反序列化,我正在使用 XmlSerializer class。所有带有子标签或带有唯一名称的子标签的标签都被正确反序列化。

我错过了什么?

谢谢。

您的 ResponseItem 基础中的属性 class 必须 是 public

public class ResponseItem
{
    [XmlElement("ISN")]
    public string ISN { get; set; }

    [XmlElement("Name")]
    public string Name { get; set; }
}

XML 序列化程序不会处理非 public 属性

我喜欢逆向工作并创建一个测试序列化程序来验证我的结构。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            Vehicle vehicle = new Vehicle() {
                Type = new Type()
                {
                    ISN = "213123214",
                    Name = "ddsd"
                },
                RegNo = 1234,
                Brand = new Mark()
                {
                    ISN = "423434234",
                    Name = "asdasd"
                },
                Model = new Mark()
                {
                    ISN = "434234324324",
                    Name = "asddsa"
                },
                estimation = new Estimation()
                {
                    Amount = 15000,
                    AmountPrev = null,
                    currency = new Currency()
                    {
                        Code = "R",
                        Name = "RU"
                    }
                }
            };

            XmlSerializer serializer = new XmlSerializer(typeof(Vehicle));

            StreamWriter writer = new StreamWriter(FILENAME);
            serializer.Serialize(writer, vehicle);
            writer.Flush();
            writer.Close();
            writer.Dispose();
        }
    }
    [XmlRoot("Vehicle")]
    public class Vehicle
    {
        [XmlElement("Type")]
        public Type Type { get; set; }
        [XmlElement("Mark")]
        public Mark Brand { get; set; }
        [XmlElement("Model")]
        public Mark Model { get; set; }
        [XmlElement("RegNo")]
        public int RegNo { get; set; }
        [XmlElement("EstimatedPrice")]
        public Estimation estimation { get; set; }
    }
    [XmlRoot("EstimationPrice")]
    public class Estimation
    {

        [XmlElement("Amount")]
        public int Amount { get; set; }
        [XmlElement("AmountPrev")]
        public int? AmountPrev { get; set; }
        [XmlElement("Currency")]
        public Currency currency { get; set; }
    }
    [XmlRoot("Currency")]
    public class Currency
    {
        [XmlElement("Code")]
        public string Code { get; set; }
        [XmlElement("Name")]
        public string Name { get; set; }
    }


    [XmlRoot("Type")]
    public class Type : ResponseItem
    {
    }
    [XmlRoot("Mark")]
    public class Mark : ResponseItem
    {
    }

    [XmlRoot("ResponseItem")]
    public class ResponseItem
    {
        [XmlElement("ISN")]
        public string ISN { get; set; }
        [XmlElement("Name")]
        public string Name { get; set; }
    }
}
​