【问题标题】:Best way to read through xml阅读xml的最佳方式
【发布时间】:2011-07-08 22:03:41
【问题描述】:

您好,我有一个这样的 xml 文档:

<Students>
<student name="A" class="1"/>
<student name="B"class="2"/>
<student name="c" class="3"/>
</Students>

我想使用XmlReader 阅读此xml 并将学生列表返回为List&lt;student&gt;。 我知道这可以实现如下:

 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 节点,并且所有具有上述属性的学生节点都只会存在。

【问题讨论】:

    标签: c# xml silverlight silverlight-4.0


    【解决方案1】:

    当然 - 使用 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 结合使用。

    【讨论】:

    【解决方案2】:

    如果我们使用 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();
    

    【讨论】:

      【解决方案3】:
      List<Student> students = (from student in doc.Element("Students").Elements("student")
                                select new Student { 
                                    Name = student.Attribute("name"), 
                                    Class = student.Attribute("class") }
                                ).ToList();
      

      【讨论】:

        【解决方案4】:

        参考下面的链接,

        http://www.nearinfinity.com/blogs/joe_ferner/performance_linq_to_sql_vs.html

        XmlReader 在 Silverlight 中受支持 (http://msdn.microsoft.com/en-us/library/cc189001(v=vs.95).aspx)

        XmlReader 和SQLDataReader 一样,基本上是一个非缓存模型,因此它们以性能为导向,但您只能“向前”移动。

        【讨论】:

          【解决方案5】:

          你可以这样使用:

          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;
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2019-01-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多