J'ai besoin d'une expression LINQ pour trouver un XElement où le nom de l'élément et ses attributs correspondent à un nœud d'entrée

StackOverflow https://stackoverflow.com/questions/155685

Question

Je dois remplacer le contenu d'un nœud dans une hiérarchie XElement lorsque le nom de l'élément et tous les noms et valeurs d'attributs correspondent à un élément d'entrée. (S'il n'y a pas de correspondance, le nouvel élément peut être ajouté.)

Par exemple, si mes données ressemblent à ceci:

<root>
  <thing1 a1="a" a2="b">one</thing1>
  <thing2 a1="a" a2="a">two</thing2>
  <thing2 a1="a" a3="b">three</thing2>
  <thing2 a1="a">four</thing2>
  <thing2 a1="a" a2="b">five</thing2>
<root>

Je veux trouver le dernier élément lorsque j'appelle une méthode avec cette entrée:

<thing2 a1="a" a2="b">new value</thing2>

La méthode ne doit comporter aucun nom d'élément ou d'attribut codé en dur. Elle correspond simplement à l'entrée des données.

Était-ce utile?

La solution

Ceci fera correspondre tout élément donné avec des paires nom de balise et nom / valeur d'attribut exactes:

public static void ReplaceOrAdd(this XElement source, XElement node)
{
    var q = from x in source.Elements()
            where x.Name == node.Name
            && x.Attributes().All(a =>node.Attributes().Any(b =>a.Name==b.Name && a.Value==b.Value))
            select x;

    var n = q.LastOrDefault();

    if (n == null) source.Add(node);
    else n.ReplaceWith(node);                                              
}

var root = XElement.Parse(data);
var newElem =XElement.Parse("<thing2 a1=\"a\" a2=\"b\">new value</thing2>");

root.ReplaceOrAdd(newElem);

Autres conseils

Vous pouvez faire un XPathSelectElement avec le chemin (ne me citez pas, allez au bar; nettoiera le matin) / root / thing2 [@ a1 = 'a' et @ a2 = 'b'] et ensuite, prenez .LastOrDefault () (XPathSelectElement est une méthode d’extension dans system.Linq.Xml).

Cela vous donnera le noeud que vous souhaitez changer. Je ne sais pas comment vous voulez le changer, cependant. Le résultat que vous obtenez est le XElement réel, donc le changer changera l'élément de l'arbre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top