5

要素名とすべての属性名と値が入力要素と一致する場合、XElement 階層内のノードの内容を置き換える必要があります。(一致しない場合は、新しい要素を追加できます。)

たとえば、データが次のようになっているとします。

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

この入力でメソッドを呼び出すときに、最後の要素を見つけたい:

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

このメソッドには、要素名や属性名をハードコードする必要はありません。入力をデータに一致させるだけです。

4

2 に答える 2

5

これは、正確なタグ名と属性名/値のペアを持つ任意の要素と一致します。

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);
于 2008-10-01T00:59:24.070 に答える
0

パスを使用して XPathSelectElement を実行できます (私を引用しないでください。バーに行ったことがあります。朝にクリーンアップします) /root/thing2[@a1='a' and @a2='b'] そして take . LastOrDefault() (XPathSelectElement は system.Linq.Xml の拡張メソッドです)。

これにより、変更したいノードが取得されます。ただし、どのように変更したいのかわかりません。得られる結果は実際の XElement であるため、それを変更するとツリー要素が変更されます。

于 2008-10-01T00:35:24.657 に答える