أحتاج إلى تعبير LINQ للعثور على xElement حيث يتطابق اسم العنصر والسمات مع عقدة الإدخال

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

سؤال

أحتاج إلى استبدال محتويات العقدة في التسلسل الهرمي 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 الفعلية ، لذا فإن تغييره سيغير عنصر الشجرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top