Linq to XML:提高性能

时间:2011-11-22 15:12:11

标签: c# performance linq-to-xml

我想使用Linq读取xml文件。这个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>

我想检索一个值的元素(例如:2)。只有当我检索元素时,才会得到标题元素。

今天,我确实喜欢这个:

        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 个答案:

答案 0 :(得分:5)

如果性能对您很重要,则不应使用doc.Descendants()在某个已知位置查找元素。它总是扫描整个文档,如果文档很大,这个文档很慢。

相反,做一些像

这样的事情
doc.Root.Element("header")

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

那应该快得多。