使用LINQ查询基于XML中的大子值获取子值

时间:2016-03-29 09:04:34

标签: c# xml linq

我有一个包含嵌套元素的XML文件。以下是我的XML数据(样本)

 <ParentNode>
   <Child1>Child1 Data</Child1>
   <Child2>
     <grandChild1 type="grandChild1attributevalue">
       <grangrandChild1>grangrandChild1 data</grangrandChild1>
       <grangrandChild2>grangrandChild2 data</grangrandChild2>
     </grandChild1>
   </Child2>
   <child3>child 3 Data</child3>
 </ParentNode>

条件:   如果“”grangrandChild1 data“与我们的数据库值匹配,那么我们必须获取child3数据值。

 If ("grangrandChild1 data" == "database value which is fetched through DB")
 {
   //Fetch "child 3 Data" i.e., I want <child3> value.
 } 

注意:

  • 数据库中存在所有grangrandChild1数据,我们正在获取这些数据并将它们与XML字段进行比较。
  • 我使用XDocument加载XML数据。

如何使用LINQ查询获取此值?

1 个答案:

答案 0 :(得分:0)

尝试以下递归算法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml = 
                "<Root>" +
                "<ParentNode>" + 
                 "<Child1>Child1 + Data</Child1>" +
                 "<Child2>" +
                   "<grandChild1 type=\"grandChild1attributevalue\">" +
                     "<grangrandChild1>grangrandChild1 data</grangrandChild1>" +
                     "<grangrandChild2>grangrandChild2 data</grangrandChild2>" +
                   "</grandChild1>" +
                 "</Child2>" +
                 "<child3>child 3 Data</child3>" +
                 "</ParentNode>" +
                 "</Root>";

            XDocument doc = XDocument.Parse(xml);
            XElement parent = doc.Descendants("ParentNode").FirstOrDefault();
            var family = GetChildren(parent);

        }
        static object GetChildren(XElement parent)
        {
            return parent.Elements().Select(x => new
            {
                type = x.Name.LocalName,
                value = x.Value,
                descendants = GetChildren(x)
            }).ToList();
        }
    }

}