c# - 在 C# 中反序列化 XML

标签 c# xml deserialization

我有以下 XML

<getAvailability>
  <result>
    <arrival_date>2013-05-05</arrival_date>
    <block>
    <block_id>80884788</block_id>
    </block>
    <id>230802</id>
   </result>
   <result>
    <arrival_date>2013-05-05</arrival_date>
    <block>
    <block_id>419097</block_id>
    </block>
    <id>98121</id>
  </result>
</getAvailability>

如何反序列化它并将其放入 C# 中的类中?非常感谢。另外这是我的代码;

XmlSerializer serializer = new XmlSerializer(typeof(getAvailability));
getAvailability output;

using (StringReader reader = new StringReader(xmlSource))
{
    output = (getAvailability)serializer.Deserialize(reader);
}

public class Result
{
    [XmlElement("block_id")]
    public string sBlockID { get; set; }

    [XmlElement("arrival_date")]
    public DateTime dArrivalDate { get; set; }

    [XmlElement("id")]
    public int iID{ get; set; }
}

[XmlRoot("getAvailability")]
public class getAvailability
{
     [XmlArray("result")]
     [XmlArrayItem("block", typeof(Result))]
     public Result[] Result { get; set; }
}

如果您需要任何进一步的信息,请告诉我。

最佳答案

最简单的方法是构建结果类,如下面的代码示例所示,以便轻松地将其映射到您提供的 XML 示例。我添加了一些评论,提供有关某些方法的信息。

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

namespace Test
{
    public class Program
    {
        public static void Main(string[] args)
        {

            Result result1 = new Result
                                 {
                                     arrival_date = new DateTime(2013, 05, 05),
                                     block = new Result.Block { block_id = 80884788 },
                                     id = 230802
                                 };
            Result result2 = new Result
                                 {
                                     arrival_date = new DateTime(2013, 05, 05),
                                     block = new Result.Block { block_id = 419097 },
                                     id = 98121
                                 };
            Results results = new Results { result = new Result[2] };
            results.result[0] = result1;
            results.result[1] = result2;

            WriteSettingsAsXml("D:\\test.xml", typeof(Results), results, true);

            Results gA = (Results)ReadSettingsFromXml("D:\\test.xml", typeof(Results));
        }

        // This `Result` class below maps to a single result in the XML you provided. This class is used in the `Results` class to obtain the needed XML structure.   

        public class Result
        {
            public class Block
            {
                public Int32 block_id { get; set; }
            }

            public DateTime arrival_date { get; set; }
            public Block block { get; set; }
            public Int32 id { get; set; }
        }

        [Serializable()]
        [XmlRootAttribute("getAvailability", Namespace = "", DataType = "", IsNullable = false)]
        public class Results
        {
            [XmlElement("result")]
            public Result[] result { get; set; }
        }

        /// Library methods that saves/reads any passed/retrieved object into/from a xml file at specified location

        public static void WriteSettingsAsXml(string destinationPath, Type objectType, object objectValue, bool hideNamespaces)
        {
            XmlSerializer serializer = new XmlSerializer(objectType);
            using (TextWriter writer = new StreamWriter(destinationPath))
            {
                if (hideNamespaces)
                {
                    XmlSerializerNamespaces hiddenNamespaces = new XmlSerializerNamespaces();
                    hiddenNamespaces.Add("", "");
                    serializer.Serialize(writer, objectValue, hiddenNamespaces);
                }
                else
                    serializer.Serialize(writer, objectValue);
                writer.Close();
            }
        }
        public static object ReadSettingsFromXml(string xmlFilePath, Type objectType)
        {
            XmlSerializer serializer = new XmlSerializer(objectType);
            using (FileStream fileStream = new FileStream(xmlFilePath, FileMode.Open))
            {
                return serializer.Deserialize(fileStream);
            }
        }
    }
}

关于c# - 在 C# 中反序列化 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16363974/

相关文章:

c# - 在新的 .net 3.5 应用程序中集成 Linq-to-Sql 或 Entity Framework ?

c# - foreach KeyValuePair in NameValueCollection?

c# - 将字符串转换为时间

c# - 数据绑定(bind)时执行字符串转换的通用结构

javascript - 如何使用变量在 Chrome 中执行 XSLT 转换

python - 为什么在python中解析xml文件会在文件中 "/>"的地方添加空格?

html - 为什么 XPath contains(text() ,'substring' ) 没有按预期工作?

java - 将数组转换为 readObject 时出现 ClassCastException

c# - 当事先不知道派生类型时使用 DataContractSerializer 反序列化派生类型

java - 实现 readObject 和 writeObject 方法以覆盖 java 中的默认序列化时允许异常吗?