我正在尝试访问父节点层次结构,直到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>
答案 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
请注意,我没有低级,但我认为如果你真的想这样做,你可以这样做。