C# 在xml文件中查找元素值的最佳/最快方法
我的程序的基本功能是搜索xml并返回元素中具有特定值的文件名 我想我必须先向您展示我的xml,然后才能继续:C# 在xml文件中查找元素值的最佳/最快方法,c#,xml,performance,element,readxml,C#,Xml,Performance,Element,Readxml,我的程序的基本功能是搜索xml并返回元素中具有特定值的文件名 我想我必须先向您展示我的xml,然后才能继续: <DocumentElement> <Protocol> <DateTime>10.03.2003</DateTime> <Item>Date</Item> <Value /> </Protocol> <Protocol>
<DocumentElement>
<Protocol>
<DateTime>10.03.2003</DateTime>
<Item>Date</Item>
<Value />
</Protocol>
<Protocol>
<DateTime>05.11.2020</DateTime>
<Item>Status</Item>
<Value>Ok</Value>
</Protocol>
</DocumentElement>
compatibleFiles
是一个列表,其中列出了具有正确布局/格式(上面的xml代码)的xml文件的所有路径。用户通过以下方式提供GetFiles
方法:
->“Item”元素应具有的值,例如“Status”itemValue
->他要检查的元素的名称(在同一“协议”元素中),例如“值”或“日期”元素
->值
元素的值,在我们的示例中为“Ok”元素
GetFiles
是否能更快,但XmlHasValue
肯定能。以下是一些测试结果:
你们知道更快的方法吗?这真的很有帮助
更新
事实证明,这一切都是因为IO线程。如果您有同样的问题,并且认为您的代码不好,您应该首先检查它是否只是一个使用所有cpu能力的线程。正如@Sinatr所提到的。在调查性能时,分析应该始终是第一步 关于什么需要时间的合理猜测是
如果您有多个文件,也可以尝试并行处理多个文件。请记住,IO主要是串行的,因此除非您有一个SSD,它可以以比文件处理更快的速度传输数据,否则您可能什么都得不到。请先使用。如果99%的时间是IO,并且您已经有SSD,那么没有什么可以改进的。除非您真的想要19456毫秒而不是19546毫秒,否则您是否尝试使用xpath查询?示例:
XmlNodeList xnList=xml.SelectNodes(“/Names/Name”)代码>你好,斯派克。这个问题与你昨天问的问题有何不同?=>如果您只对优化XML解析性能感兴趣,那么不应该使用XDocument.load
直接从文件系统加载XML。首先使用字符串变量中的file.ReadAllText
读取文件文本,然后使用该方法解析字符串。这样,您将能够获得您感兴趣的零件的精确测量值。
public List<string> GetFiles(string itemValue, string element, string value)
{
return compatibleFiles.Where(path => XmlHasValue(path, itemValue, element, value)).ToList();
}
private bool XmlHasValue(string filePath, string itemValue, string element, string value)
{
try
{
string foundValue = XDocument.Load(filePath)
.Descendants()
.Where(el => el.Name == "Item" && el.Value == itemValue)
.First()
.Parent
.Descendants()
.Where(des => des.Name == element && des.Value == value)
.First()
.Value;
return foundValue == value;
}
catch (Exception)
{
return false;
}
}