2011-11-22 108 views
1

我想使用Linq读取xml文件。该XML文件是由1报头和N子元素的这样的:Linq to XML:提高性能

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

是否有更好的方法来解析该文件? (并提高性能?)

回答

5

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

相反,这样做

doc.Root.Element("header") 

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

这应该是要快得多。