将特定XML数据反序列化为C#类

时间:2017-04-16 17:13:12

标签: c# xml deserialization

我希望我不会重复这个问题,但我找不到能帮助我的东西。

我有以下.xml,我想反序列化到我的班级。

<?xml version="1.0" encoding="UTF-8" ?>
<config>
    <buildings>
        <building>
            <name>Name</name>
            <id>1</id>
            <build_time>750</build_time>
            <time_factor>1.2</time_factor>
        </building>
        <building>
            <name>Name</name>
            <id>2</id>
            <build_time>150</build_time>
            <time_factor>1.8</time_factor>
        </building>
        <building>
            <name>Name</name>
            <id>3</id>
            <build_time>950</build_time>
            <time_factor>1.4</time_factor>
        </building>
    </buildings>
</config>

我想将id = 2的元素中的name,id,building_time和time_factor加载到下面的类中。

public class Test
{
    public string name { get; set; }
    public int id { get; set; }
    public int build_time { get; set; }
    public double time_factor { get; set; }
}

执行此任务的最佳方法是什么? 谢谢。

2 个答案:

答案 0 :(得分:0)

您可以将XML加载到System.Xml.XmlDocumenthttps://msdn.microsoft.com/en-us/library/system.xml.xmldocument(v=vs.110).aspx)类实例中,并将所需的特定节点读入C#对象。

另一种选择是,您可以使用XPATH(https://msdn.microsoft.com/en-us/library/ms256086(v=vs.110).aspx)。

希望它有所帮助。

答案 1 :(得分:0)

请尝试以下操作:

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test2.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            Test test1 = doc.Descendants("building")
                .Where(x => (int)x.Element("id") == 1)
                .Select(x => new Test() {
                    name = (string)x.Element("name"),
                    id = (int)x.Element("id"),
                    build_time = (int)x.Element("build_time"),
                    time_factor = (double)x.Element("time_factor")
                }).FirstOrDefault();
        }
    }
    public class Test
    {
        public string name { get; set; }
        public int id { get; set; }
        public int build_time { get; set; }
        public double time_factor { get; set; }
    }
}