Frage

Ich muss den Inhalt eines Knotens in einer Xelement -Hierarchie ersetzen, wenn der Elementname und alle Attributnamen und -Werte mit einem Eingabeelement übereinstimmen. (Wenn es keine Übereinstimmung gibt, kann das neue Element hinzugefügt werden.)

Zum Beispiel, wenn meine Daten so aussehen:

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

Ich möchte das letzte Element finden, wenn ich mit dieser Eingabe eine Methode aufrufe:

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

Die Methode sollte kein fest codiertes Element- oder Attributnamen haben - sie stimmt einfach mit der Eingabe der Daten überein.

War es hilfreich?

Lösung

Dies stimmt zu jedem bestimmten Element mit dem genauen Tag -Namen und den Attributnamen/-wertpaaren überein:

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

Andere Tipps

Sie können eine xPathSelectelement mit dem Pfad machen (zitieren Sie mich nicht, war in der Balken; wird im Morgen aufräumen) /root /ding2 [ @a1 = 'a' und @a2 = 'B'] und dann nehmen. LastRordeFault () (xPathSectelement ist eine Erweiterungsmethode in System.linq.xml).

Damit bringen Sie den Knoten, den Sie ändern möchten. Ich bin mir jedoch nicht sicher, wie Sie es ändern möchten. Das Ergebnis, das Sie erhalten, ist das tatsächliche Xelement, sodass es das Baumelement ändert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top