如何在c#中遍历父节点到xml中的根元素

时间:2016-03-09 06:43:19

标签: c# xml

我正在尝试访问父节点层次结构,直到C#中的子元素为根元素,并希望将其存储在字符串中。

在下面的xml中,我想访问<watchVideo>元素的父节点,但我不想在我的字符串中包含根标记,输出应该是这样的:

herobanner.landing.copies.watchvideo

我的xml格式为:

<?xml version="1.0"?>
<root>  
  <country>en-in</country>
  <heroBanner>
    <landing>
      <copies>
        <watchVideo>watch the video</watchVideo>
        <scrollDown>READ INSPIRING STORIES</scrollDown>
        <scrollDown/>
        <banner>make your</banner>
        <banner>first move this</banner>
        <banner>valentine's Day</banner>
      </copies>
      <background>
        <desktop>assets/images/millions-hero-1.jpg</desktop>
      </background>
      <foreground>
        <desktop/>
      </foreground>
      <video>
        <youtubeId>buwcDIcFR8I</youtubeId>
      </video>
    </landing>
  </heroBanner>
</root>

1 个答案:

答案 0 :(得分:6)

好吧,要从一个XElement转到它的父级,你可以使用Parent属性 - 但在这种情况下你需要所有的祖先,所以你可以使用AncestorsAndSelf()方法。这会以反向文档顺序返回祖先,但是您希望它按文档顺序排列(最外层),这样您就可以反转序列。然后你知道第一个元素将是根 - 你可以通过调用Skip(1)来跳过它。然后,您只需选择元素名称,然后将它们连接在一起。所以:

var names = element.AncestorsAndSelf()
                   .Reverse()
                   .Skip(1) // Skip the root
                   .Select(x => x.Name);
var joined = string.Join(".", names);

完成计划:

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

class Test
{
    static void Main()
    {
        var doc = XDocument.Load("test.xml");
        var element = doc.Descendants("watchVideo").First();
        var names = element.AncestorsAndSelf()
                   .Reverse()
                   .Skip(1) // Skip the root
                   .Select(x => x.Name);
        var joined = string.Join(".", names);
        Console.WriteLine(joined);
    }
}

输出:

heroBanner.landing.copies.watchVideo

请注意,我没有低级,但我认为如果你真的想这样做,你可以这样做。