Я пишу программу на C#, которая будет проходить через кучу файлов config.xml и обновлять некоторые элементы или добавлять их, если они не существуют. У меня есть часть вниз, который обновляет элемент, если он существует с этим кодом:Дублирующие элементы при добавлении XElement в XDocument
XDocument xdoc = XDocument.Parse(ReadFile(_file));
XElement element = xdoc.Elements("project").Elements("logRotator")
.Elements("daysToKeep").Single();
element.Value = _DoRevert;
Но я бегу в проблемы, когда я хочу, чтобы добавить элемент, который не существует. В большинстве случаев часть дерева находится на месте, и когда я использую свой код, он добавляет другое идентичное дерево, и это заставляет программу считывать xml взорваться.
вот как я пытаюсь сделать это
xdoc.Element("project").Add(new XElement("logRotator", new XElement("daysToKeep", _day)));
и что приводит к структуре, как это (Тег numToKeep уже есть):
<project>
<logRotator>
<daysToKeep>10</daysToKeep>
</logRotator>
<logRotator>
<numToKeep>13</numToKeep>
</logRotator>
</project>
, но это то, что я хочу
<project>
<logRotator>
<daysToKeep>10</daysToKeep>
<numToKeep>13</numToKeep>
</logRotator>
</project>
Вот что я думал, но несколько раз дерево глубже, а иногда это может быть «отрезаны» при различных длинах, и я бы просто предположить не написать случай для каждой возможности. – Andy
@Andy: Вы можете добавить запрос xpath, чтобы сразу получить все ваши объекты logRotator ... затем проверьте, есть ли у них дети daysToKeep и numToKeep ... если нет ... добавьте их. Если это так ... перейдите на следующий logRotator. – Scott
@Scott: Его (и наш) код использует метод '.Element()', который получает первый элемент, поэтому мы можем смело предположить, что это всего лишь один элемент. – Codesleuth