尽量减少读取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,并执行以下操作
- 如果验证属性是prsent检查其值即0或1并执行一些操作
- 如果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);
}
试试这个:
var elements = xml.Elements("Control").Where(
e => e.Attribute("ToValidate") != null
&& e.Attribute("ToValidate").Value == "1"
);
正如我接受的答案,我想OP会混淆代码的性能和长度:-) –
我想知道为什么我的答案的最后部分(复制)并标记为接受? –
看到这个:
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");
非常感谢,它的工作原理。 – user1006897
1.leave的是执行checkval操作
- 建立控制和不验证它不检查其值
希望你通过
好的。那么你到目前为止尝试过什么?!我们不是来做你的功课。 –
这很好。你的问题是什么?试图完成这个任务时,你遇到过一些具体问题吗?请记住,StackOverflow不是一家外包公司,您可以在其中发布您的客户/老板/老师要求并接收源代码作为交换。 –
我试过上面写的功能 – user1006897