Обновление дочернего атрибута XElement (или клонированного XElement) - PullRequest
0 голосов
/ 17 октября 2010

У меня есть XML следующим образом.

<AFConfig>
 <Geographies>
  <Geography id="Place1" description="NicePlace">
   <MetaData>
    <Services>
     <Service>
     ...
     ...
     </Service>
    </Services>
   </MetaData>
   <Systems>
    <DefaultSystem systemName="SYSONE" server=http"//192.168.0.0" />
   </Systems>
  </Geography>
 <Geographies> 
</AFConfig>

Вот что я хочу сделать.

  1. Клонировать элемент Geography и добавить его как родственный элемент (т. Е. Child to Geographies)
  2. Обновить "id", "description" новыми значениями AND
  3. обновите имя системы с новым значением

Мой код.

XDocument xd_Document = XDocument.Load(s_FileName);
XElement xe_Element = (from xe in xd_Document.XPathSelectElements(s_Element)
                       where xe.Attribute(s_IdAttr).Value == s_Value
                       select xe).SingleOrDefault();
XElement xe_NewElement = CloneElement(xe_Element)
foreach(KeyValuePair<string, string> s in d_AttrValue)
    xe_NewElement.Attribute(s.Key).Value = d_AttrValue[s.Key];
xe_Element.Parent.Add(xe_NewElement);
xd_Document.Save(s_destFileName);

Я передаю этому методу следующую строку параметров s_FileName, строку s_destFileName, строку s_Element, строку s_IdAttr, строку s_Value, словарь d_AttrValue

С помощью этого кода я могу изменитьатрибуты id и description.

Вопрос: Как я могу изменить атрибут systemName DefaultSystem со значением?

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

1 Ответ

0 голосов
/ 17 октября 2010
xe_NewElement.Element("Systems")
    .Element("DefaultSystem")
    .Attribute("systemName")
    .Value = "Enter your value here";

Я считаю, что должен делать то, что вам нужно.

РЕДАКТИРОВАТЬ:

var attribute = ((IEnumerable)xe_NewElement.XPathEvaluate("Systems/DefaultSystem/@systemName"))
    .Cast<XAttribute>().FirstOrDefault();

attribute.Value = "Введите здесь свое значение";

Должно позволитьтак вам, как правило, передавая список xpaths и значений.

...