Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XmlSerializer迭代和解析XML_C#_Xml_Visual Studio 2010_Xmlserializer - Fatal编程技术网

C# 使用XmlSerializer迭代和解析XML

C# 使用XmlSerializer迭代和解析XML,c#,xml,visual-studio-2010,xmlserializer,C#,Xml,Visual Studio 2010,Xmlserializer,我试图理解如何解析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);

我试图理解如何解析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();
    }
我想知道如何使用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;
    }
公共静态列表读取(字符串文件名,类型t)
{
List objs=new List();
XmlSerializer writer=新的XmlSerializer(t);
StreamReader R=新系统.IO.StreamReader(文件名);
while(未到达文件末尾){
对象数据=writer.Deserialize(R);
添加(数据);
}
R.关闭();
返回对象;
}
我在这里看到了很多问题,但我不能理解其中的大部分,而且它们使用不同的东西来解析和迭代XML。 几天前我开始学C#,所以我知道的不多。感谢您的帮助!:因此反序列化程序将把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; }
}

这可能很明显,但这些“var”是什么?我以为它们只在JS中使用。这只是一个隐式声明。编译器确定实际类型,因此它仍然是强类型。对我来说,它清理了代码,因为它减少了输入,而且很多时候它使重构更容易。
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; }
}