尽量减少读取XML的性能成本

问题描述:

我的XML文件是这样..尽量减少读取XML的性能成本

<?xml version="1.0" encoding="utf-8" ?> 
<Controls> 
     <Control ToValidate="0" ControlID="cmbTrialType" ControlType="FormControl" EngineValueID="" Enabled="0" Visible="1" Single="1" Input="1" Value="Superiority" ListInitValues="Superiority" FormulaEntered="" Caption="" IsValid="1" DecimalPlaces="" /> 
     <Control ToValidate="1" ControlID="cmbTrialType" ControlType="FormControl" EngineValueID="" Enabled="1" Visible="0" Single="1" Input="1" Value="Superiority" ListInitValues="Superiority" FormulaEntered="" Caption="" IsValid="1" DecimalPlaces="" /> 
</Controls> 

我需要阅读该XML,并执行以下操作

  1. 如果验证属性是prsent检查其值即0或1并执行一些操作
  2. 如果validate属性不是prsent dnt,则不执行任何操作,即不检查其值。

我试着写下面的函数,但是它的性能代价要多得多。

public void LoadXML(String xmlFileName) 
     { 
      Stopwatch sw = new Stopwatch(); 
      sw.Start(); 
      string refernceFileName = xmlFileName; 
      XmlTextReader textReader = new XmlTextReader(refernceFileName); 
      //int count = 0; 
      // Read until end of file 
      while (textReader.Read()) 
      { 
       XmlNodeType nType = textReader.NodeType; 

       // if node type is an element 
       if (nType == XmlNodeType.Element) 
       { 
        if (textReader.Name.Equals("Control")) 
        { 
         if (textReader.AttributeCount >= 1) 
         { 
           String val = string.Empty; 
           val = textReader.GetAttribute("Visible"); 

           if (!(val == null || val.Equals(string.Empty))) 
           { 
            int choice = Int32.Parse(val); 
            switch (choice) 
            { 
             case 0: Console.WriteLine("Visible"); 
              break; 
             case 1: Console.WriteLine("Not Visible"); 
              break; 
            } 
           } 
         } 
        } 
       } 
      } 
      sw.Stop(); 
      Console.WriteLine("Elapsed={0}", sw.Elapsed); 
      //Console.WriteLine(count); 
     } 
+2

好的。那么你到目前为止尝试过什么?!我们不是来做你的功课。 –

+1

这很好。你的问题是什么?试图完成这个任务时,你遇到过一些具体问题吗?请记住,StackOverflow不是一家外包公司,您可以在其中发布您的客户/老板/老师要求并接收源代码作为交换。 –

+0

我试过上面写的功能 – user1006897

试试这个:

var elements = xml.Elements("Control").Where(
    e => e.Attribute("ToValidate") != null 
    && e.Attribute("ToValidate").Value == "1" 
); 
+0

正如我接受的答案,我想OP会混淆代码的性能和长度:-) –

+5

我想知道为什么我的答案的最后部分(复制)并标记为接受? –

看到这个:

var xml = XElement.Load(@"path\to\your\xml\file"); 

var elements = xml.Elements("Control").Where(e => e.Attribute("ToValidate") != null); 

foreach(var element in elements) 
{ 
    var validateAttribute = element.Attribute("ToValidate").Value; 
    if (validateAttribute == "0") 
    { 
     // something if invalid 
    } 
    else 
    { 
     // something if valid 
    } 
} 

如果您有意向只是与元素,其中只有ToValidate="1"ToValidate="0"存在工作。您可以考虑使用此:

var elements = xml.Elements("Control").Where(e => e.Attribute("ToValidate") != null && 
                e.Attribute("ToValidate").Value == "1"); 
+0

非常感谢,它的工作原理。 – user1006897

1.leave的是执行checkval操作

  1. 建立控制和不验证它不检查其值

希望你通过