Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在xml文件中查找元素值的最佳/最快方法_C#_Xml_Performance_Element_Readxml - Fatal编程技术网

C# 在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>

我的程序的基本功能是搜索xml并返回元素中具有特定值的文件名

我想我必须先向您展示我的xml,然后才能继续:

 <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
方法:

  • itemValue
    ->“Item”元素应具有的值,例如“Status”
  • 元素
    ->他要检查的元素的名称(在同一“协议”元素中),例如“值”或“日期”
  • ->
    元素
    元素的值,在我们的示例中为“Ok”
问题是,这些方法需要很长时间才能完成,我几乎可以肯定有更好更快的方法来完成我想要的。我不知道
GetFiles
是否能更快,但
XmlHasValue
肯定能。以下是一些测试结果:

你们知道更快的方法吗?这真的很有帮助

更新


事实证明,这一切都是因为IO线程。如果您有同样的问题,并且认为您的代码不好,您应该首先检查它是否只是一个使用所有cpu能力的线程。

正如@Sinatr所提到的。在调查性能时,分析应该始终是第一步

关于什么需要时间的合理猜测是

  • 木卫一
  • 解析
  • IO可以通过获得更快的磁盘或在RAM中缓存结果来改进。如果执行多个搜索,后者可能会大大提高性能,但会引入缓存失效等问题

    根据“”的说法,XmlReader是解析xml的最快方法


    如果您有多个文件,也可以尝试并行处理多个文件。请记住,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;
        }
    }