我有一个特殊的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; }
}
最好有一个榜样来进一步发展。
答案 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; }
}
}