C# 如何在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

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

在下面的xml中,我想访问元素的父节点,但我不想在字符串中包含根标记,输出应如下所示:

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查询。谢谢乔恩的帮助,你节省了我的时间。