Какой самый эффективный способ найти и установить значения элементов в XDocument? - PullRequest
1 голос
/ 18 ноября 2008

С учетом следующего XML-шаблона:

<Request module="CRM" call="list_service_features" id="{ID}">
  <block name="auth">
     <a name="username" format="text">{USERNAME}</a>
     <a name="password" format="password">{PASSWORD}</a>
     <a name="client-id" format="counting">{CLIENT-ID}</a>
  </block>
  <a name="service-id" format="counting">{SERVICE-ID}</a>
</Request>

Используя XDocument, каков наилучший способ установить значения в фигурных скобках. Я дошел до этого, но застрял в лучшем способе выбрать каждый из трех <a /> узлов внутри элемента <block/>. Это всего лишь небольшой фрагмент XML, другие могут содержать до 20 <a name="..."></a> элементов.

То, как был построен XML, - это не мое творение, а то, что мы должны отправить в «веб-сервис» нашего поставщика ... прежде чем кто-нибудь посмеется над атрибутом format = "counting":)

@ David - приветствует ответ, приветствуется. Я надеялся, что это будет немного элегантнее, вроде:

List<XElement> e = doc.Descendants("a").ToList();
e.Where(x => x.Attributes("name") == "username").Single().Value = "abc";
e.Where(x => x.Attributes("name") == "password").Single().Value = "abc";

Ясно, что приведенный выше код не работает, но я подумал, что для каждого из тегов <a>

будет один элегантный вкладыш

1 Ответ

3 голосов
/ 18 ноября 2008

Это делает это для вас? Старый добрый потомок собственности.

string xmlInput = ...;
XDocument myDoc = XDocument.Parse(xmlInput);
//
List<XElement> someElements = myDoc.Descendants("a").ToList();
someElements.ForEach(x => x.Value = "Foo");
//
Console.WriteLine(myDoc);

Хм, я вижу, у тебя есть атрибут. Может сделать это тоже:

string xmlInput = //...
XDocument myDoc = XDocument.Parse(xmlInput);
//
List<XText> someText =
  myDoc.Descendants()
  .Nodes()
  .OfType<XText>()
  .Where(x => x.Value.StartsWith("{") && x.Value.EndsWith("}"))
  .ToList();
//
List<XAttribute> someAttributes =
  myDoc.Descendants()
  .Attributes()
  .Where(x => x.Value.StartsWith("{") && x.Value.EndsWith("}"))
  .ToList();
//
someText.ForEach(x => x.Value = "Foo");
someAttributes.ForEach(x => x.Value = "Bar");
//
Console.WriteLine(myDoc);

Ах, теперь с тем, что вы ожидаете, я заставлю это работать:

List<XElement> e = myDoc.Descendants("a").ToList();
e.Where(x => x.Attribute("name").Value == "username").Single().Value = "abc";
e.Where(x => x.Attribute("name").Value == "password").Single().Value = "abc";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...