Чтение и условная запись в сложные XML-файлы с помощью LINQ - PullRequest
2 голосов
/ 11 ноября 2011

Я подозреваю, что решение моей проблемы будет очень простым с LINQ to XML, но я довольно новичок в этом и, похоже, наткнулся на стены.(Кроме того, я не смог найти достойного учебника, который бы охватывал подобные случаи с моими, поэтому, если вы можете указать мне на что-то там, это очень ценится!)

Что мне нужно сделать, это:

  • У меня есть файл XML, из которого я должен прочитать, который вы можете найти ниже.Обычно в файле только одна ветвь, которая содержит несколько заказов.Каждый заказ имеет уникальный код.Эти заказы содержат несколько параметров, каждый из которых также имеет уникальный код.

  • Мне дан код заказа и код параметра, и теперь я должен найти правильный заказ, и в пределахэтот порядок правильный параметр.

  • Для этого одного параметра мне нужно обновить поля «numericValue» и «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 ]

2 голосов
/ 11 ноября 2011

Предполагая, что элементы с таким кодом заказа или кодом параметра, который вы ищете, существуют, следующий фрагмент кода должен дать вам представление:

    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
0 голосов
/ 11 ноября 2011

Ян - вы должны проверить этот пост . Он охватывает запросы и сохранение - оба элемента, которые вам интересны для LINQ-to-XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...