0

我试图了解如何解析 XML。这是我用来写的:

public static void Write(object data, string fileName)
    {
        XmlSerializer writer = new XmlSerializer(data.GetType());

        StreamWriter W = new System.IO.StreamWriter(fileName);
        writer.Serialize(W, data);
        W.Close();
    }
    public static void Write(List<object> data, string fileName)
    {
        XmlSerializer writer = new XmlSerializer(data.GetType());

        StreamWriter W = new System.IO.StreamWriter(fileName);
        foreach (object o in data)
        {
            writer.Serialize(W, o);
        }
        W.Close();
    }

而且,当我想阅读时,这是我迄今为止所做的:

public static object Read(string fileName, Type t)
    {
        XmlSerializer writer = new XmlSerializer(t);

        StreamReader R = new System.IO.StreamReader(fileName);
        object Data = writer.Deserialize(R);
        R.Close();

        return Data;
    }

我想知道如何使用 XmlSerializer 和 StreamReader 遍历 XML 并获取对象。如果可能的话,我不想使用任何其他东西,因为我已经理解了这一点。这是我认为该方法应该是的方式:

 public static List<Object> Read(string fileName, Type t)
    {
        List<Object> objs = new List<Object>();
        XmlSerializer writer = new XmlSerializer(t);
        StreamReader R = new System.IO.StreamReader(fileName);
        while(didn't reach the end of the file){
            object Data = writer.Deserialize(R);
            objs.Add(Data);
        }
        R.Close();

        return objs;
    }

我在这里看到了很多问题,但我无法理解其中的大部分,除了他们使用不同的东西来解析和迭代 XML。几天前我开始使用 C#,所以我不太了解。任何帮助表示赞赏!:D

4

1 回答 1

0

因此,反序列化器会将 xml 文件“转换”为您指定的类。因此,一旦您将 xml 反序列化为您的类的实例,您将拥有这些值。除非您有几个需要反序列化为类列表的 xml 文件,否则无需迭代。这是一个将在 linqpad 中运行以显示基本概念的简单示例。我更喜欢 DataContractSerializer 但概念是一样的。

void Main()
{
using (var writer = new FileStream("dog.xml", FileMode.Create, FileAccess.Write))
{
    var savedog = new Dog();
    savedog.Breed = "Boxer";
    savedog.Weight = 95;
    var serializer = new DataContractSerializer(typeof(Dog));
    serializer.WriteObject(writer, savedog);
}

using (var reader = new FileStream("dog.xml", FileMode.Open, FileAccess.Read))
{
    var serializer = new DataContractSerializer(typeof(Dog));
    var recalldog = (Dog)serializer.ReadObject(reader);
    Console.WriteLine(recalldog.Breed);
    Console.WriteLine(recalldog.Weight);
}   
}

public class Dog
{
public string Breed { get; set; }
public int Weight { get; set; }
}
于 2013-11-13T00:15:28.903 回答