2008-11-18 5 views
1

Étant donné le code XML suivant « modèle »:Quel est le moyen le plus efficace pour localiser et définir les valeurs d'éléments dans un 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> 

En utilisant XDocument, quelle est la meilleure façon de définir les valeurs entre accolades. J'ai été si loin mais je me suis retrouvé coincé sur la meilleure façon de sélectionner chacun des trois nœuds <a /> à l'intérieur de l'élément <block/>. Ceci est juste un petit fragment de XML, d'autres peuvent avoir jusqu'à 20 éléments <a name="..."></a>.

La la façon dont le XML est construit n'a pas été ma création, il est ce que nous devons envoyer à « service web » de notre fournisseur ... avant que quelqu'un a un rire au format = « comptage » attribut :)

@David - bravo pour la réponse, appréciée. J'étais un peu en espérant qu'il serait un peu plus élégant, un peu le long des lignes de:

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

Il est clair que le code ne fonctionne pas au-dessus mais je pensais qu'il y aurait une élégante doublure un pour chacune des balises <a>

Répondre

3

Est-ce que ceci le fait pour vous? Bonne vieille propriété Descendants.

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

Hmm, je vois que vous avez un attribut là-dedans. Peut faire aussi:

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); 

Ah, maintenant avec ce que vous attendez, je vais le faire fonctionner:

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

Ouais c'est ce que je cherche. Je suis arrivé à quelque chose de similaire mais plus maladroit: e.Attributes ("nom"). Où (a => a.Value == "nom d'utilisateur"). Single(). Parent.Value = "abcdef"; Très appréciée! – Kev

+0

Rien de maladroit ici. Cela semble bon. –

Questions connexes