使用模型进行xml序列化/反序列化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用模型进行xml序列化/反序列化相关的知识,希望对你有一定的参考价值。

我想要实现的是XML输出,如:

<cars>
 <car id="0">
  <Type>1</Type>
  <Class>B</Class>
 </car>
 <car id="1">
  <Type>1</Type>
  <Class>B</Class>
 </car>
</cars>

所有汽车数据都在单独的XML文件中。以下代码的一部分我可以使用汽车模型将这些数据读入字典:

    public Dictionary<int, ModelCar> Car { get; }

    public Cars()
    {

        Car = new Dictionary<int, ModelCar>();

        foreach (var File in Directory.GetFiles(Folder, "*.xml", SearchOption.TopDirectoryOnly))
        {

            ModelCar item = new ModelCar().DeserializeFile(File);

            Car.Add(item.Id, item);

        }

    }

问题是编写字典'Car',它将所有汽车数据保存到组合的XML输出/输入中。关于模型'Cars'应该如何以及如何调用的任何提示/教程/示例?

编辑:现在看这篇文章 - https://stackoverflow.com/a/19600156/8333405

答案

首先,您需要修复XML以获得正确的结束标记,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<cars>
  <car id="0">
    <Type>1</Type>
    <Class>Buick</Class>
  </car>
  <car id="1">
    <Type>1</Type>
    <Class>B</Class>
  </car>
</cars>

然后,您可以让Visual Studio为您创建模型。

  1. 复制XML文件内容。
  2. 从Visual Studio菜单中选择编辑 - >选择性粘贴 - >将XML粘贴为类。

现在,Visual Studio生成了您的模型。要使用它们,请使用以下代码:

// you do not need a dictionary. A List will do it.
List<carsCar> allCars = new List<carsCar>();

string folder = @"G:ProjectsStackOverFlowWpfApp2";

foreach (var file in Directory.GetFiles(folder, "*.xml", SearchOption.TopDirectoryOnly))
{
    FileStream reader = File.OpenRead(file);
    XmlSerializer ser = new XmlSerializer(typeof(cars));
    cars cars = (cars)ser.Deserialize(reader);

    allCars.AddRange(cars.car);
}

// if you want the car with id = 0
var car_0 = allCars.FirstOrDefault(c => c.id == 0);
另一答案

尝试使用XML Linq

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

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            Cars cars = new Cars();
            XElement xCars = cars.Serialize();
        }
    }
    public class Cars
    {
        public Dictionary<int, ModelCar> Car { get; set; }


        public Cars()
        {

            Car = new Dictionary<int, ModelCar>() {
                {0, new ModelCar() { _class = "B", _type = 1, id = 0}},
                {1, new ModelCar() { _class = "B", _type = 1, id = 1}}
            };
        }
        public XElement Serialize()
        {
            return new XElement("cars", Car.AsEnumerable().Select(x => new XElement("car", new object[] {
                new XAttribute("id", x.Key),
                new XElement("Type", x.Value._type),
                new XElement("Class", x.Value._class)
            })));
        }
    }
    public class ModelCar
    {
        public int id { get; set; }
        public int _type { get; set; }
        public string _class { get;set; }
    }
}

以上是关于使用模型进行xml序列化/反序列化的主要内容,如果未能解决你的问题,请参考以下文章

使用 Servicestack.Text 进行 XML 反序列化

创建 C# 模型以反序列化 XML 提要

无法反序列化 xml 数组以列出 web api 模型 c#

在 C# 中使用德文小数分隔符对双精度值进行 XML 反序列化

GolangGo 语言 XML 的序列与反序列化实践

GolangGo 语言 XML 的序列与反序列化实践