我有一个像这样的xml文档:
<Students>
<student name="A" class="1"/>
<student name="B"class="2"/>
<student name="c" class="3"/>
</Students>
我想使用XmlReader
来阅读此xml,并将学生列表作为List<student>
返回。
我知道这可以通过以下方式实现:
List<Student> students = new List<Student>();
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
节点,所有具有上述属性的学生节点将只在那里。
答案 0 :(得分:48)
绝对 - 使用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
结合使用。
答案 1 :(得分:8)
如果我们使用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();
答案 2 :(得分:1)
List<Student> students = (from student in doc.Element("Students").Elements("student")
select new Student {
Name = student.Attribute("name"),
Class = student.Attribute("class") }
).ToList();
答案 3 :(得分:1)
请参阅以下链接,
http://www.nearinfinity.com/blogs/joe_ferner/performance_linq_to_sql_vs.html
Silverlight支持 XmlReader
(http://msdn.microsoft.com/en-us/library/cc189001(v=vs.95).aspx)
XmlReader
一样的{p> SQLDataReader
基本上是一个非缓存模型,所以它们是面向性能的,但你只能用它向前移动。
答案 4 :(得分:0)
您可以这样使用:
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 + "<br />");
break;
case XmlNodeType.EndElement:
Response.Write("</" + reader.Name + ">");
break;
}
}
}