Лучший способ прочитать через XML - PullRequest
17 голосов
/ 04 марта 2011

HI У меня есть 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 узел, и все студенческие узлы с вышеуказанными атрибутами будут только там.

Ответы [ 5 ]

48 голосов
/ 04 марта 2011

Абсолютно - используйте 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, если вы просто хотите получить поддеревья документа.

8 голосов
/ 04 марта 2011

Намного проще, если мы используем 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();
1 голос
/ 27 ноября 2012

См. Ссылку ниже,

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в основном это не кешируемая модель, поэтому они ориентированы на производительность, но с этим вы можете двигаться только вперед.

1 голос
/ 04 марта 2011
List<Student> students = (from student in doc.Element("Students").Elements("student")
                          select new Student { 
                              Name = student.Attribute("name"), 
                              Class = student.Attribute("class") }
                          ).ToList();
0 голосов
/ 11 марта 2015

Вы можете использовать так:

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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...