Xelement.descendants ("العقدة") لا يتصرف كما هو متوقع ، يعيد مستويات متعددة من النسل

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

  •  20-09-2019
  •  | 
  •  

سؤال

لدي مشكلة. لدي بيانات XML هرمية مثل:

<Tree>
  <Node Text="Stuff" ItemGUID="064a9bf0-0594-47f8-87be-88dd73763c77" >
    <Node Text="Food" ItemGUID="326f1f7a-d364-4838-9bdc-ce5fd93f88ca" ItemType="2" />
    <Node Text="Wines" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
    <Node Text="Flowers" ItemGUID="cefa8c34-af06-48e7-9c00-4b1422d217a4">
        <Node Text="Roses" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f">
              <Node Text="Red" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
              <Node Text="Pink" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
              <Node Text="White" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
        </Node>
        <Node Text="Tulips" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
        <Node Text="Whatever" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
    </Node>
    <Node Text="Sweet Delights" ItemGUID="1df7dbae-adf0-49a9-aaac-1358468a245b" />
  </Node>
</Tree>

وأنا بحاجة إلى الحصول على زهور فقط (الورود ، الزنبق ، أيا كان) بدون أحمر ، وردي ، أبيض (تحت الورود) أنا أستخدم الكود التالي ، ولكن بسبب حقيقة أن جميع العقد "عقدة" أحصل على جميع مستويات أحفاد . أود تقييده على مستوى واحد فقط.

XElement loadedXML = clients.ItemTreeXML;

//filter only current node
XElement procXML;
procXML = new XElement ("Tree",
          from el in loadedXML.Descendants("Node")
          where (string)el.Attribute("ItemGUID") == currentNodeGUID
          select el); 

النتيجة مطلوبة:

<Tree>
        <Node Text="Flowers" ItemGUID="cefa8c34-af06-48e7-9c00-4b1422d217a4">
            <Node Text="Roses" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
            <Node Text="Tulips" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
            <Node Text="Whatever" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
        </Node>
</Tree>

شكرًا،

إضافة: ربما لا يمكن استعادة استعلام SQL 2008 فقط إلى فرع العقدة الذي أحتاجه ، ولكن بعد الكثير من الأبحاث والاختبار ، لم أتمكن من العثور على إجابة ... (بلدي XML في عمود XML في SQL 2008)

هل كانت مفيدة؟

المحلول

لذلك لدينا هذا ...

XElement loadedXML = XElement.Load("test.xml");

//filter only current node
XElement procXML;
procXML = new XElement("Tree",
    from el in loadedXML.Descendants("Node")
    where (string)el.Attribute("ItemGUID") == currentNodeGUID
    select el);

أفضل طريقة وجدتها هي إزالة جميع عناصر الطفل بعد إجراء استعلام LINQ. مثله:

foreach (XElement xl in procXML.Element("Node").Elements("Node"))
{
    if (xl.HasElements) // just remove the ones without child elements
    {
        xl.RemoveNodes();
    }
}

سيؤدي ذلك إلى إخراج ما تريده ، لكن يجب أن أضيف ... هناك بالتأكيد طريقة أفضل للقيام بذلك. لا أعرف مدى جودة العمل مع وضعك بالنظر إلى أن معظم الكود المكتوب يحتاج إلى العمل بشكل ديناميكي أكثر من هذا.

رأيت هذا السؤال وقررت أن تأخذ الغوص في LINQ ، أعتقد أنه لم يكن بهذا السوء. إذا لم ينجح ذلك بالطريقة التي يحتاجها ، فهي بداية على الأقل.

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