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'] 然后取 . LastOrDefault()(XPathSelectElement 是 system.Linq.Xml 中的扩展方法)。

这将为您提供要更改的节点。但是,我不确定您要如何更改它。您得到的结果是实际的 XElement,因此更改它会更改树元素。

于 2008-10-01T00:35:24.657 回答