Это самый эффективный способ загрузки значений XML в структуру? - PullRequest
1 голос
/ 07 октября 2009

Я пытаюсь загрузить данные из XML-строки в какую-то структуру, поэтому после загрузки я могу сказать Data.PropertyName, чтобы прочитать значения.

Является ли приведенный ниже код наиболее оптимальным способом загрузки данных в структуру?

Очевидно, что вызов First () приводит к попаданию в память, поэтому, если у вас есть элементы с подэлементами, вызовет First () для каждого из них?

Спасибо

    string xml = @"<ROOT>
                   <ID>1</ID>
                   <NAME>RF1</NAME>
                   <STAT>10200</STAT>
                   <TEST>
                       <ID>1</ID>
                       <NAME>BIGUN</NAME>
                   </TEST>
                   </ROOT>
                   ";

     XElement Data = XElement.Parse(xml);


     var Element = (from p in Data.Descendants("ROOT") 
                   select new { 
                        ID = (int)p.Element("ID"), 
                        Test = new { 
                                    ID = p.Element("TEST").Descendants("ID").First(), 
                                    NAME = p.Element("TEST").Descendants("NAME").First() 
                                 }, 
                        Stat = p.Element("STAT") }).First();

//Read Element.ID, Element.Test.Name

Ответы [ 3 ]

3 голосов
/ 07 октября 2009

Вы можете использовать XmlSerializer для десериализации?

using System;
using System.IO;
using System.Xml.Serialization;

[XmlRoot("ROOT")]
public class MyType
{
    [XmlElement("ID")]
    public string Id { get; set; }
    [XmlElement("NAME")]
    public string Name { get; set; }
    [XmlElement("STAT")]
    public string Stat { get; set; }
    [XmlElement("TEST")]
    public MyOtherType Nested { get; set; }
}
public class MyOtherType
{
    [XmlElement("ID")]
    public string Id { get; set; }
    [XmlElement("NAME")]
    public string Name { get; set; }
}
static class Program
{

    static void Main()
    {
        string xml = @"<ROOT>
                   <ID>1</ID>
                   <NAME>RF1</NAME>
                   <STAT>10200</STAT>
                   <TEST>
                       <ID>1</ID>
                       <NAME>BIGUN</NAME>
                   </TEST>
                   </ROOT>";
        MyType obj = (MyType) new XmlSerializer(typeof(MyType))
            .Deserialize(new StringReader(xml));
        Console.WriteLine(obj.Id);
        Console.WriteLine(obj.Name);
        Console.WriteLine(obj.Stat);
        Console.WriteLine(obj.Nested.Id);
        Console.WriteLine(obj.Nested.Name);
    }
}
1 голос
/ 07 октября 2009

Я бы пошел на десериализацию и атрибуты Xml: гораздо более читабельный.

0 голосов
/ 07 октября 2009

Нет, это не самый оптимальный способ, но, вероятно, будет достаточно хорошим.

Наиболее оптимальным с точки зрения производительности было бы написание собственного синтаксического анализатора XML, специализированного только для этого, но, конечно, это было бы намного больше кода.

Я не знаю, почему вас волнует метод First. Он просто пропустит первый элемент, а затем прекратит чтение, поэтому не вызовет никаких проблем. Разумеется, синтаксический анализатор XML по-прежнему должен анализировать все дочерние элементы.

...