Обновление элементов в Nested Xml - PullRequest
0 голосов
/ 03 июня 2009

У меня есть XML, который выглядит так:

<DataMapper xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SqlTable />
  <Level_01s>
    <DataParameter>
      <SqlTable>MY-Table-Name</SqlTable>
      <Children>
        <DataParameter>
          <SqlTable>MY-Table-Name</SqlTable>
          <Children>
            <DataParameter>
              <SqlTable>MY-Table-Name</SqlTable>
              <Children>
                <DataParameter>
                  <SqlTable>[All]</SqlTable>
                  <Children />
                </DataParameter>
                <DataParameter>
                  <SqlTable>MY-Table-Name</SqlTable>
                  <Children>
                    <DataParameter>
                      <SqlTable>[All]</SqlTable>
                      <Children />
                    </DataParameter>
                  </Children>
                </DataParameter>
              </Children>
            </DataParameter>
          </Children>
        </DataParameter>
      </Children>
    </DataParameter>
  </Level_01s>
</ DataMapper>

Что я хотел бы сделать, это обновить все экземпляры элемента. Проблема, с которой я столкнулся, заключается в том, что DataParameters может углубляться на n уровней.

Как я могу рекурсивно гарантировать, что я обновлю все это?

Я использую этот код для обновления элементов корневого уровня:

XDocument xdoc = XDocument.Parse(myxmlstring);
var element = xdoc.Elements("SqlTable").Single();
element.Value = "foo";        
xdoc.Save("file.xml");

через Лучший способ изменить значение элемента в C #

1 Ответ

3 голосов
/ 03 июня 2009

Если вы используете Descendants («SqlTable») вместо Elements («SqlTable»). Single (), вы получите все элементы «SQLTable» во всем документе. Тогда вы можете просто просмотреть их и обновить элементы.

var elements = xdoc.Descendants("SqlTable");

foreach (var sqlTable in elements)
{
    sqlTable.Value = "foo";
}  

Или, если вы хотите быть кратким, вы можете сделать все это в синтаксисе LINQ

Обновлено на основе комментария , Добавлено. Где используется предикат для построения списка в качестве примера использования условия.

xdoc.Descendants("SqlTable").Where(s => s.Value != "All").ToList().ForEach(p => p.Value = "foo");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...