如何反序列化具有不同标记名但具有相同子标记的XML

本文关键字:XML 反序列化 | 更新日期: 2023-09-27 18:26:22

我有以下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#将其反序列化到目标对象。这是我的目标类:

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"指定为这个子类的根标记,但没有效果。

p.S.类别标记、型号和类型源自基类:

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

对于反序列化,我使用XmlSerializer类。具有到子标记或具有唯一名称的子标记的所有标记都已正确反序列化。

我错过了什么?

谢谢。

如何反序列化具有不同标记名但具有相同子标记的XML

ResponseItem基类中的属性必须为公共

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

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

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

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