Linq to XML: повышение производительности - PullRequest
1 голос
/ 22 ноября 2011

Я хочу прочитать XML-файл, используя Linq. Этот XML-файл состоит из 1 заголовка и N подэлементов, например:

<rootNode>
         <header>
            <company name="Dexter Corp." />
         </header>
         <elements>
           <element>one</element>
           <element>eleven</element>
           <element>three</element>
           <element>four</element>
           <element>five</element>
           <element>three</element>
           <element>two</element>
           <element>two</element>
         </elements>
</rootNode>

Я хочу получить элементы, которые имеют значение (пример: два). И только если я получаю элементы, я получаю элементы заголовка.

Сегодня я делаю так:

        string xmlFilePath = @"C:\numbers.xml";
        XDocument doc = XDocument.Load(xmlFilePath);

        var header = doc.Descendants().Elements("header");
        var elements = doc.Descendants()
            .Elements("elements")
                .Elements("element")
                .Where(el => el.Value == "two");

        // I get this values even if there is no 'elements'
        string companyName = header.Descendants("company").Attributes("name").Single().Value;
        string serialNumber = header.Descendants("serial").Single().Value;


        return elements.Select(el => new {Company = companyName, Serial = serialNumber, Value = el.Value});

Есть ли лучший способ для анализа файла? (и повысить производительность?)

1 Ответ

5 голосов
/ 22 ноября 2011

Если производительность важна для вас, вы не должны использовать doc.Descendants() для поиска элемента в известном месте.Он всегда сканирует весь документ, что очень медленно, если документ большой.

Вместо этого сделайте что-то вроде

doc.Root.Element("header")

или

doc.Root.Element("elements")
        .Elements("element")
        .Where(el => el.Value == "two")

Это должно быть многобыстрее.

...