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

时间:2011-11-11 16:23:07

标签: c# .net xml linq-to-xml

我怀疑使用LINQ to XML可以很容易地解决我的问题,但我对它很新,而且似乎遇到了问题。 (另外,我找不到一个体面的教程,涵盖了我的类似案例,所以如果你能指出我的任何东西,我们非常感谢!)

我需要做的是:

  • 我有一个我必须阅读的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>

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

2 个答案:

答案 0 :(得分:2)

假设确保具有该订单代码的元素和您正在寻找的参数代码存在,下面的代码片段应该给您一个想法:

    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

答案 1 :(得分:0)

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