c#从XML读入类并写回文件的最佳方法

时间:2019-04-21 21:25:11

标签: c# xml

我有一个特殊的XML文件,该文件具有更多属性,但为了举例说明我要实现的目标,我将其简化为以下内容:

<?xml version="1.0" encoding="utf-8" ?>
<Ref1 Att11="XXX" Att21="YYY" Att31="ZZZ">
 <Ref2 Att12="AAA" Att22="BBB" Att32="CCC">
 <Ref3 Att13="111" Att23="222" Att33="333"/>
 </Ref2>
</Ref1>

该文件将包含许多Ref2个元素,但每个元素只有一个Ref3。 由于某种原因,XML文件没有</Ref3>块,而只有/>

将XML文件中的数据读取到类结构中,然后反向写入文件后的最佳方法是什么?

我创建了应该用于读取数据的类,但是我不确定如何从此处继续。 我甚至不确定Ref3。 当现实是原始XML在所有Ref 1, 2 and 3上具有数十个属性时,我也担心这个简单的示例。

public class Ref1
{
    public string Att11 { get; set; }
    public string Att21 { get; set; }
    public string Att31 { get; set; }

    public List<Ref2> ref2;
}

public class Ref2
{
    public string Att12 { get; set; }
    public string Att22 { get; set; }
    public string Att32 { get; set; }

    public Ref3 ref3;
}

public class Ref3
{
    public string Att13 { get; set; }
    public string Att23 { get; set; }
    public string Att33 { get; set; }
}

最好有一个榜样来进一步发展。

1 个答案:

答案 0 :(得分:2)

这不是最快的问题,而是最好的方法。由于您的要求是序列化和反序列化,因此我建议使用Xml序列化。参见下面的代码:

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

namespace ConsoleApplication1
{
    class Program
    {
        const string INPUT_FILENAME = @"c:\temp\test.xml";
        const string OUTPUT_FILENAME = @"c:\temp\test1.xml";
        static void Main(string[] args)
        {
            XmlReaderSettings rSettings = new XmlReaderSettings();
            rSettings.Schemas = null;
            XmlReader reader = XmlReader.Create(INPUT_FILENAME, rSettings);
            XmlSerializer serializer = new XmlSerializer(typeof(Ref1), string.Empty);

            Ref1 ref1 = (Ref1)serializer.Deserialize(reader );


            XmlWriterSettings wSettings = new XmlWriterSettings();
            wSettings.Indent = true;
            XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
            namespaces.Add("","");
            XmlWriter writer = XmlWriter.Create(OUTPUT_FILENAME, wSettings);
            serializer.Serialize(writer, ref1, namespaces);
        }
    }
    public class Ref1
    {
        [XmlAttribute("Att11")]
        public string Att11 { get; set; }
        [XmlAttribute("Att21")]
        public string Att21 { get; set; }
        [XmlAttribute("Att31")]
        public string Att31 { get; set; }
        [XmlElement("Ref2")]
        public List<Ref2> ref2;
    }

    public class Ref2
    {
        [XmlAttribute("Att12")]
        public string Att12 { get; set; }
        [XmlAttribute("Att22")]
        public string Att22 { get; set; }
        [XmlAttribute("Att32")]
        public string Att32 { get; set; }

        [XmlElement("Ref3")]
        public Ref3 ref3;
    }

    public class Ref3
    {
        [XmlAttribute("Att13")]
        public string Att13 { get; set; }
        [XmlAttribute("Att23")]
        public string Att23 { get; set; }
        [XmlAttribute("Att33")]
        public string Att33 { get; set; }
    }
}