2008-11-18 4 views
1

Учитывая следующий XML «шаблон»:Каков наиболее эффективный способ поиска и установки значений элементов в XDocument?

<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 был не мое творения, это то, что мы должны послать к нашему поставщику «веб-сервису» ... прежде, чем кто-либо имеет смех в формате = «подсчет» атрибут :)

@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> тегов

ответ

3

Это делает это за вас? Хорошее свойство старых потомков.

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"; 
+0

Да, это то, что я ищу. Я пришел к чему-то подобному, но более неуклюжим: e.Attributes («name»). Где (a => a.Value == "username"). Single(). Parent.Value = "abcdef"; Очень признателен! – Kev 2008-11-18 20:22:56