阅读xml的最佳方式
我有一个像这样的xml文档:
我想使用XmlReader
来读取这个xml并返回一个学生List
作为List
。 我知道这可以实现如下:
List students = new List(); XmlReader reader = XmlReader.Create("AppManifest.xml"); while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "student") { students.Add(new Student() { Name = reader.GetAttribute("name"), Class = reader.GetAttribute("Class") }); } }
我只是想知道是否有更好的解决方案?
我正在使用silverlight 4.xml结构是静态的,即。 它将只有一个Students
节点,所有具有上述属性的学生节点将只在那里。
绝对 – 使用LINQ to XML。 它简单得多:
XDocument doc = XDocument.Load("AppManifest.xml"); var students = doc.Root .Elements("student") .Select(x => new Student { Name = (string) x.Attribute("name"), Class = (string) x.Attribute("class") }) .ToList();
XmlReader
是一个相对较低级别的类型 – 我会避免它,除非你真的无法承受一次将整个XML篡改到内存中。 即使这样,如果您只想要文档的子树,也可以将LINQ to XML与XmlReader
结合使用。
如果我们使用Linq xml,它会更容易:
var xDoc = XDocument.Load("AppManifest.xml"); var students = xDoc.Root.Elements("student") .Select(n => new Student { Name = (string)n.Attribute("name"), Class = (string)n.Attribute("class"), }) .ToList();
List students = (from student in doc.Element("Students").Elements("student") select new Student { Name = student.Attribute("name"), Class = student.Attribute("class") } ).ToList();
请参阅下面的链接,
http://www.nearinfinity.com/blogs/joe_ferner/performance_linq_to_sql_vs.html
Silverlight支持XmlReader
( http://msdn.microsoft.com/en-us/library/cc189001 ( XmlReader
= vs.95 ) .aspx )
像SQLDataReader
这样的XmlReader
基本上是一个非缓存模型,所以它们是面向性能的,但你只能用它来移动’Forward’。
你可以这样使用:
protected void Page_Load(object sender, EventArgs e) { XmlTextReader reader = new XmlTextReader(Server.MapPath("~/XML")); while(reader.Read()) { switch(reader.NodeType) { case XmlNodeType.Element: var lbl = new Label(); lbl.Text=(reader.Name + " -> " ); break; case XmlNodeType.Text: Response.Write(reader.Value + "
"); break; case XmlNodeType.EndElement: Response.Write("" + reader.Name + ">"); break; } } }