Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 使用LINQ读取和有条件地写入复杂XML文件_C#_.net_Xml_Linq To Xml - Fatal编程技术网

C# 使用LINQ读取和有条件地写入复杂XML文件

C# 使用LINQ读取和有条件地写入复杂XML文件,c#,.net,xml,linq-to-xml,C#,.net,Xml,Linq To Xml,我怀疑使用LINQtoXML解决我的问题非常简单,但我对它相当陌生,似乎遇到了麻烦。(另外,我也找不到一本涵盖类似案例的像样的教程,所以如果你能给我指出任何内容,我将不胜感激!) 我需要做的是: 我有一个必须读取的XML文件,您可以在下面找到。文件中通常只有一个分支,其中包含多个订单。每个订单都有一个唯一的代码。这些订单包含多个参数,每个参数都有一个唯一的代码 我得到了一个顺序代码和一个参数代码,现在我必须找到正确的顺序,在这个顺序中找到正确的参数 对于这一个参数,我需要更新“numerica

我怀疑使用LINQtoXML解决我的问题非常简单,但我对它相当陌生,似乎遇到了麻烦。(另外,我也找不到一本涵盖类似案例的像样的教程,所以如果你能给我指出任何内容,我将不胜感激!)

我需要做的是:

  • 我有一个必须读取的XML文件,您可以在下面找到。文件中通常只有一个分支,其中包含多个订单。每个订单都有一个唯一的代码。这些订单包含多个参数,每个参数都有一个唯一的代码

  • 我得到了一个顺序代码和一个参数代码,现在我必须找到正确的顺序,在这个顺序中找到正确的参数

  • 对于这一个参数,我需要更新“numericalValue”和“stringValue”字段。 这对我来说是困难的部分:由于上面提到的两个条件,看起来我必须在过程中引入两个中间变量,每个变量在其
    where
    子句中都有一个条件,第二个条件构建在第一个条件之上

  • 然后,我必须将整个XML文件写回磁盘,现在包含我的两个小更改。对于我上面所描述的中间变量,像这样把整个事情重新组合起来对我来说似乎是一条特别棘手的道路

下面是我的XML文件:

<xyz version="1.2.3" 
     xmlns="http://www.mycompany.com/xyz"
     xmlns:abc="http://www.mycompany.com/xyz/abc">
  <header>
    <!-- some unimportant stuff -->
  </header>
  <body>
    <abc:abc version="1.3">
      <abc:branches>
        <abc:branch>
          <!-- some unimportant stuff -->
          <abc:orders>
            <abc:order>
check this-> <abc:orderCode>FOO</abc:orderCode>
              <abc:orderParameters>
                <abc:orderParameter>
  and this->   <abc:parameterCode>BAR</abc:parameterCode>
                  <abc:billedValue>
                    <abc:value>
       then change -> <abc:numericalValue>10</abc:numericalValue>
       these two   -> <abc:stringValue>ten</abc:stringValue>
                    </abc:value>
                  </abc:billedValue>
                </abc:orderParameter>
                <abc:orderParameter>
                  <!-- similar contents -->
                </abc:orderParameter>
                <!-- some more orderParameter instances -->
              </abc:orderParameters>
            </abc:order>
            <abc:order>
              <!-- similar contents as above -->
            </abc:order>
            <!-- some more order instances here -->
          </abc:orders>
        </abc:branch>
      </abc:branches>
    </abc:abc>
  </body>
</xyz>

检查此->FOO
这个->酒吧
然后更改->10
这两张->十张

正如我所说的,我怀疑解决方案相当简单,但我现在似乎还没弄明白(尤其是我必须把整个事情写回去的部分)。

Jan-你应该去看看。它包括查询和保存-您对LINQ to XML感兴趣的两个项目。

假设确保您要查找的元素的顺序代码和参数代码都存在,下面的代码片段应该会让您有所了解:

    string orderCode = "FOO";
    string paramCode = "BAR";

    XDocument doc = XDocument.Load("file.xml");

    XNamespace abc = "http://www.mycompany.com/xyz/abc";

    XElement value = 
        doc
        .Descendants(abc + "order")
        .First(o => o.Element(abc + "orderCode").Value == orderCode)
        .Descendants(abc + "orderParameter")
        .First(p => p.Element(abc + "parameterCode").Value == paramCode)
        .Element(abc + "billedValue")
        .Element(abc + "value");

    value.SetElementValue(abc + "numericalValue", 20);
    value.SetElementValue(abc + "stringValue", "twenty");

    doc.Save(Console.Out); // do doc.Save("file.xml") to overwrite

谢谢你的回答!但我的主要问题是条件部分——我需要准确地处理这两个我想要更改的实例,然后将它们写回我收到的未更改的XML文档中。太棒了,这就是我想要的!非常感谢!:-)