C# 如何在c中遍历xml中的父节点直到根元素
我试图从C中的子元素访问父节点层次结构直到根元素,并希望将其存储在字符串中 在下面的xml中,我想访问元素的父节点,但我不想在字符串中包含根标记,输出应如下所示:C# 如何在c中遍历xml中的父节点直到根元素,c#,xml,C#,Xml,我试图从C中的子元素访问父节点层次结构直到根元素,并希望将其存储在字符串中 在下面的xml中,我想访问元素的父节点,但我不想在字符串中包含根标记,输出应如下所示: herobanner.landing.copies.watchvideo 我的xml格式是: <?xml version="1.0"?> <root> <country>en-in</country> <heroBanner> <landing&g
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>
好的,要从一个XElement到其父元素,您可以只使用parent属性——但在本例中,您需要所有的祖先,因此可以使用AncestorsAndSelf方法。这将以相反的文档顺序返回祖先,但您希望先以最外层的文档顺序返回祖先,以便可以颠倒顺序。然后您知道第一个元素将是根-您可以通过调用Skip1跳过它。然后您只需要选择元素名称,并将它们连接在一起。因此:
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
请注意,我没有降低它的大小写,但我假设如果您真的愿意,您可以这样做。好吧,要从一个XElement到其父元素,您可以只使用parent属性-但在这种情况下,您需要所有的祖先,因此您可以使用AncestorsAndSelf方法。这将以相反的文档顺序返回祖先,但您希望先以最外层的文档顺序返回祖先,以便可以颠倒顺序。然后您知道第一个元素将是根-您可以通过调用Skip1跳过它。然后您只需要选择元素名称,并将它们连接在一起。因此:
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
请注意,我没有降低它的大小写,但我认为如果您真的愿意,您可以这样做。请展示您迄今为止所做的尝试。我们甚至不知道您使用的是哪一个XML库也无济于事——我建议使用LINQtoXML,这使它成为一个单行程序。另外,请发布您的实际XML文本,而不是在每个元素之前显示在浏览器中的内容。接下来,将整个XML缩进四个空格,以便正确显示-在点击post之前查看预览。请显示您迄今为止所做的尝试。我们甚至不知道您使用的是哪一个XML库也无济于事——我建议使用LINQtoXML,这使它成为一个单行程序。另外,请发布您的实际XML文本,而不是在每个元素之前显示在浏览器中的内容。接下来,将整个XML缩进四个空格,以便正确显示-在点击post之前查看预览。谢谢。这真的很有帮助。你能告诉我,如果我想迭代每个孩子。我们如何才能做到这一点?例如,1 heroBanner.landing.copies.watchVideo 2 heroBanner.landing.copies.scrolldown 3 heroBanner.landing.copies.banner 4 heroBanner.landing.copies。banner@John:您现在正在问后续问题。这非常不适合堆栈溢出。每个帖子一个问题。我已经向您展示了如何从单个元素转换为所需的格式。现在,您应该研究如何使用LINQtoXML遍历元素。任何LINQtoXML教程都应该能够帮助您。我已经应用了foreach在doc.substands中遍历,并将所有元素存储在列表中。之后,我可以对每个子代使用linq查询。谢谢乔恩的帮助,你节省了我的时间。谢谢你。真的很有帮助。你能告诉我,如果我想迭代每个孩子。我们如何才能做到这一点?例如,1 heroBanner.landing.copies.watchVideo 2 heroBanner.landing.copies.scrolldown 3 heroBanner.landing.copies.banner 4 heroBanner.landing.copies。banner@John:您现在正在问后续问题。这非常不适合堆栈溢出。每个帖子一个问题。我已经向您展示了如何从单个元素转换为所需的格式。现在,您应该研究如何使用LINQtoXML遍历元素。任何LINQtoXML教程都应该能够帮助您。我已经应用了foreach在doc.substands中遍历,并将所有元素存储在列表中。之后,我可以对每个子代使用linq查询。谢谢乔恩的帮助,你节省了我的时间。