أحتاج إلى تعبير LINQ للعثور على xElement حيث يتطابق اسم العنصر والسمات مع عقدة الإدخال
-
03-07-2019 - |
سؤال
أحتاج إلى استبدال محتويات العقدة في التسلسل الهرمي 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>
يجب ألا تحتوي الطريقة على عنصر أو أسماء سمات مرمزة - إنها ببساطة تطابق الإدخال مع البيانات.
المحلول
سيتطابق هذا
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);
نصائح أخرى
يمكنك القيام بعملية XpathselectElement مع المسار (لا تقتبس مني ، وذهبت إلى الشريط ؛ سوف تنظف في الضحى) /root /thing2 [ @a1 = 'a' و @a2 = 'b'] ثم خذها. LastorDefault () (xPathSelectElement هي طريقة تمديد في system.linq.xml).
سوف تحصل على العقدة التي ترغب في تغييرها. لست متأكدًا من الطريقة التي تريد تغييرها بها. والنتيجة التي تحصل عليها هي xElement الفعلية ، لذا فإن تغييره سيغير عنصر الشجرة.