1

这是我的 XML 结构:

<DirectoryNode Id="297fe1ac-ff9b-4c40-ada4-86dc713a9537" Title="Root">
   <DirectoryNode Id="80e01248-1170-4393-a327-b97409d51159" Title="A">
      <DirectoryNode Id="e6db6d3f-be30-4cdf-b79e-864cc9b52c5f" Title="A1">
         <DirectoryNode Id="4368d898-6fb0-4e2f-ba56-edbaf4bd0077" Title="A11" />
      </DirectoryNode>
      <DirectoryNode Id="11c5336b-462e-45dc-b4d3-92032ebc3ae3" Title="A2" />
   </DirectoryNode>
   <DirectoryNode Id="b983fd39-fc2e-43e0-80e6-3808fb47f995" Title="B">
      <DirectoryNode Id="433851d6-9935-4adb-9acb-7055c26e85cb" Title="B1">
         <DirectoryNode Id="f2602aed-6d97-4e46-9e8a-fb181b28f0c8" Title="B11" />
      </DirectoryNode>
   </DirectoryNode>
   <DirectoryNode Id="9144d8cf-93c0-4de6-9109-448d396a9e17" Title="C" />
   <DirectoryNode Id="182491af-452e-40bc-b51e-59f078db3ad3" Title="D" />
</DirectoryNode>

我要做的是在给定目录节点 ID 的情况下获取根节点(不是主根节点)ID。这里有一些例子:

  1. 给定 A11 的 ID,我想要 A 的 ID
  2. 给定 A2 的 ID,我想要 A 的 ID
  3. 给定 A 的 ID,我想要 A 的 ID
  4. 给定 B1 的 ID,我想要 B 的 ID

在解析 xml 和提取值时,我很糟糕——有人知道快速的方法吗?

4

2 回答 2

3

听起来你可以使用类似的东西:

XDocument doc = XDocument.Parse("nodes.xml");
XElement node = doc.Descendants("DirectoryNode")
                   .Where(n => (string) n.Attribute("Id") == id)
                   .Single();

// Now go up until we find the highest node beneatht the document root node
while (node.Parent != doc.Root)
{
    node = node.Parent;
}

请注意,如果可能有多个节点具有相同的 ID,或者该 ID 可能根本不存在,则您必须更改您的查询。例如,如果您只关心第一个匹配项,但可能没有匹配项,您可以更改SingleFirstOrDefault()然后使用(在while循环之前):

if (node == null)
{
    // No matches. Take appropriate action here.
}
于 2012-09-26T21:26:53.243 回答
0

这是一种递归的方法。

using System;
using System.Linq;
using System.Xml.Linq;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            string sampleXml =  @"<DirectoryNode Id=""297fe1ac-ff9b-4c40-ada4-86dc713a9537"" Title=""Root"">" + Environment.NewLine +
                                @"   <DirectoryNode Id=""80e01248-1170-4393-a327-b97409d51159"" Title=""A"">" + Environment.NewLine +
                                @"      <DirectoryNode Id=""e6db6d3f-be30-4cdf-b79e-864cc9b52c5f"" Title=""A1"">" + Environment.NewLine +
                                @"         <DirectoryNode Id=""4368d898-6fb0-4e2f-ba56-edbaf4bd0077"" Title=""A11"" />" + Environment.NewLine +
                                @"      </DirectoryNode>" + Environment.NewLine +
                                @"      <DirectoryNode Id=""11c5336b-462e-45dc-b4d3-92032ebc3ae3"" Title=""A2"" />" + Environment.NewLine +
                                @"   </DirectoryNode>" + Environment.NewLine +
                                @"   <DirectoryNode Id=""b983fd39-fc2e-43e0-80e6-3808fb47f995"" Title=""B"">" + Environment.NewLine +
                                @"      <DirectoryNode Id=""433851d6-9935-4adb-9acb-7055c26e85cb"" Title=""B1"">" + Environment.NewLine +
                                @"         <DirectoryNode Id=""f2602aed-6d97-4e46-9e8a-fb181b28f0c8"" Title=""B11"" />" + Environment.NewLine +
                                @"      </DirectoryNode>" + Environment.NewLine +
                                @"   </DirectoryNode>" + Environment.NewLine +
                                @"   <DirectoryNode Id=""9144d8cf-93c0-4de6-9109-448d396a9e17"" Title=""C"" />" + Environment.NewLine +
                                @"   <DirectoryNode Id=""182491af-452e-40bc-b51e-59f078db3ad3"" Title=""D"" />" + Environment.NewLine +
                                @"</DirectoryNode>" + Environment.NewLine +
                                @"";

            XDocument document = XDocument.Parse(sampleXml);

            //    Given A11's Id, I want A's Id
            XElement parentDirectory = GetParentDirectory(document.Descendants("DirectoryNode").Single(element => (string) element.Attribute("Title") == "A11"));
            Console.WriteLine(parentDirectory.Attribute("Title").Value);

            //    Given A2's Id, I want A's Id
            parentDirectory = GetParentDirectory(document.Descendants("DirectoryNode").Single(element => (string)element.Attribute("Title") == "A2"));
            Console.WriteLine(parentDirectory.Attribute("Title").Value);

            //    Given A's Id, I want A's Id
            parentDirectory = GetParentDirectory(document.Descendants("DirectoryNode").Single(element => (string)element.Attribute("Title") == "A"));
            Console.WriteLine(parentDirectory.Attribute("Title").Value);

            //    Given B1's Id, I want B's Id
            parentDirectory = GetParentDirectory(document.Descendants("DirectoryNode").Single(element => (string)element.Attribute("Title") == "B1"));
            Console.WriteLine(parentDirectory.Attribute("Title").Value);

            Console.ReadLine();
        }

        public static XElement GetParentDirectory(XElement element)
        {
            if (element.Parent == element.Document.Root)
                return element;

            return GetParentDirectory(element.Parent);
        }
    }
}
于 2012-09-27T00:00:58.640 回答