如何在C#中查询和过滤XML文件?

如何在C#中查询和过滤XML文件?,c#,xml,C#,Xml,我已经使用VisualStudio一段时间了,并尝试学习用C语言编程 目前,我的重点是xml结构 具体而言,我正在尝试开发一个简单的控制台应用程序,它基本上: 加载一个xml文件——这是另一个结构相当复杂的程序的输出 通过某些类似sql的过滤语句过滤此xml文件上的信息 将结果另存为另一个xml文件 我正在处理的xml文件是一个包含数千个重复行的大文件(其中包含有关某个进程结果的信息)。为了说明这一点,此xml文件的缩写版本如下: <?xml version="1.0"?> <

我已经使用VisualStudio一段时间了,并尝试学习用C语言编程

目前,我的重点是xml结构

具体而言,我正在尝试开发一个简单的控制台应用程序,它基本上:

  • 加载一个xml文件——这是另一个结构相当复杂的程序的输出
  • 通过某些类似sql的过滤语句过滤此xml文件上的信息
  • 将结果另存为另一个xml文件
  • 我正在处理的xml文件是一个包含数千个重复行的大文件(其中包含有关某个进程结果的信息)。为了说明这一点,此xml文件的缩写版本如下:

    <?xml version="1.0"?>
    <OptimizationResultList xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <Results>
        <OptimizationResult>
          <Symbol>GARAN60</Symbol>
          <ParameterValues>
            <double>120</double>
            <double>1</double>
            <double>120</double>
            <double>1</double>
            <double>1</double>
          </ParameterValues>
          <Results>
            <double>-94926.02</double>
            <double>-3.59</double>
            <double>236</double>
            <double>32.2</double>
            <double>-0.04</double>
          </Results>
          <AverageProfitAcrossTotalTimeSpan>0</AverageProfitAcrossTotalTimeSpan>
        </OptimizationResult>
        <OptimizationResult>
          <Symbol>GARAN60</Symbol>
          <ParameterValues>
            <double>120</double>
            <double>1</double>
            <double>120</double>
            <double>2</double>
            <double>1</double>
          </ParameterValues>
          <Results>
            <double>-149389.21</double>
            <double>-5.76</double>
            <double>282</double>
            <double>33.69</double>
            <double>-0.05</double>
          </Results>
          <AverageProfitAcrossTotalTimeSpan>0</AverageProfitAcrossTotalTimeSpan>
        </OptimizationResult>
        <OptimizationResult>
          <Symbol>GARAN60</Symbol>
          <ParameterValues>
            <double>120</double>
            <double>1</double>
            <double>120</double>
            <double>3</double>
            <double>1</double>
          </ParameterValues>
          <Results>
            <double>-64926.02</double>
            <double>-5.59</double>
            <double>636</double>
            <double>42.2</double>
            <double>0.04</double>
          </Results>
          <AverageProfitAcrossTotalTimeSpan>0</AverageProfitAcrossTotalTimeSpan>
        </OptimizationResult>
      </Results>
      <Names>
        <string>Net Profit</string>
        <string>APR %</string>
        <string>Trades</string>
        <string>Winning %</string>
        <string>Avg Profit %</string>
      </Names>
      <Symbols>
        <string>GARAN60</string>
      </Symbols>
      <StrategyID>8fbc3832-7a0d-497c-bfab-a2c52dd15761</StrategyID>
      <Scorecard>MS123 Scorecard</Scorecard>
      <OptimizationMethod>Exhaustive</OptimizationMethod>
    </OptimizationResultList>
    
    
    加兰60
    120
    1.
    120
    1.
    1.
    -94926.02
    -3.59
    236
    32.2
    -0.04
    0
    加兰60
    120
    1.
    120
    2.
    1.
    -149389.21
    -5.76
    282
    33.69
    -0.05
    0
    加兰60
    120
    1.
    120
    3.
    1.
    -64926.02
    -5.59
    636
    42.2
    0.04
    0
    净利润
    四月%
    交易
    获胜%
    平均利润%
    加兰60
    8fbc3832-7a0d-497c-bfab-a2c52dd15761
    MS123记分卡
    详尽的
    
    (正如您所注意到的,结果(这是输出xml的主干)在这里重复了3次。在大多数情况下,原始文件包含50K+个条目。)

    我的问题基本上是:

    如何用C#编写代码来过滤此XML并仅返回结果:

    1)结果>优化结果>参数值>参数值的第二个双精度值介于1和3之间

    2)和,结果>优化结果>结果>结果的第三个双倍值大于500

    我访问了stackoverflow.com中的许多条目,查看了MSDN页面,但坦率地说,我无法最终确定执行此过滤的代码

    提前感谢您的帮助


    Aykut Saribiyik

    基本上,我解决这个问题的方法不是改进我的xml编辑能力,而是简单地依靠我以前的好习惯。简单地说,我现在将相关元素的所有相关值加载到一个DataTable中。完成此操作后,查询变得更加容易。另一方面,这并不划算,因为我必须将大量数据加载到DataTable中,只是为了运行一些简单的查询。然而,这次我选择的是效率而不是效率。谢谢大家的关注。Aykut–Aykut Saribiyik刚刚编辑

    如果您无法“完成”表明您至少已经开始的代码,为什么不向我们展示您已经完成的工作,并告诉我们您遇到的问题?我强烈建议使用LINQtoXML。我觉得这不是一个好的长期策略。您说查询变得容易多了,但这对我来说只是表明您从未真正了解LINQ到XML。这其实并不难,不必返回数据表的好处是巨大的。为什么不再试一次,把你的代码编辑成问题?然后,其他人可以帮助你添加一个新的字符串到你的弓。如果没有这一点,你最好删除这个问题,因为它对其他任何人都没有任何帮助。