首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xdoc查找特定top元素中的多个子后代元素

使用xdoc查找特定top元素中的多个子后代元素
EN

Stack Overflow用户
提问于 2019-07-05 18:27:58
回答 2查看 108关注 0票数 0

我有这种类型的xml文件,我正在尝试获取每个组的Id和Host。

代码语言:javascript
复制
<AAA>
  <Group>BTeam</Group>
  <CCC>
    <DDD>
      <Id>1234</Id>
      <Host>BTeamHost</Host>
    </DDD>
  </CCC>
</AAA>

<AAA>
  <Group>CTeam</Group>
  <CCC>
    <DDD>
      <Id>3234</Id>
      <Host>CTeamHost</Host>
    </DDD>
  </CCC>
</AAA>  

目前,我可以获取文件中的每个组,但以下代码无法在group.Value上匹配

代码语言:javascript
复制
XDocument xdoc = XDocument.Load(xml);
foreach (XElement group in xdoc.Root.Descendants("AAA").Elements("Group"))
{
    if (xdoc.Root.Descendants("AAA").Elements("Group").Equals(group.Value))
    {
        var id = xdoc.Root.Descendants("AAA").Descendants("CCC").Descendants("DDD").Descendants("Id").FirstOrDefault().Value;
        var host = xdoc.Root.Descendants("AAA").Descendants("CCC").Descendants("DDD").Descendants("Host").FirstOrDefault().Value;
        Console.WriteLine("Group: {0} Id: {1} Host: {2}", group, id, host);
    }
}

如果我尝试这样做,我会从第一个组中获得相同的id和主机,而不是从每个组中获得。

代码语言:javascript
复制
XDocument xdoc = XDocument.Load(xml);
foreach (XElement group in xdoc.Root.Descendants("AAA").Elements("Group"))
{
    var id = xdoc.Root.Descendants("AAA").Descendants("CCC").Descendants("DDD").Descendants("Id").FirstOrDefault().Value;
    var host = xdoc.Root.Descendants("AAA").Descendants("CCC").Descendants("DDD").Descendants("Host").FirstOrDefault().Value;
    Console.WriteLine("Group: {0} Id: {1} Host: {2}", group, id, host);
}

组: BTeam Id: 1234主机: BTeamHost

组: CTeam Id: 1234主机: BTeamHost

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-05 19:21:01

您可以通过在group上调用ElementsAfterSelf来获取对<CCC>元素的引用。这将打印这两个组:

代码语言:javascript
复制
XDocument xdoc = XDocument.Load(xml);
foreach (XElement group in xdoc.Root.Descendants("AAA").Elements("Group"))
{
    var ddd = group.ElementsAfterSelf("CCC").Descendants("DDD");
    var id = ddd.Descendants("Id").FirstOrDefault().Value;
    var host = ddd.Descendants("Host").FirstOrDefault().Value;
    Console.WriteLine("Group: {0} Id: {1} Host: {2}", group.Value, id, host);
}
票数 0
EN

Stack Overflow用户

发布于 2019-07-05 21:14:38

尝试以下操作:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            var results = doc.Descendants("AAA")
                .GroupBy(x => x.Element("Group"))
                .Select(x => new
                {
                    group = x.Key,
                    id = (string)x.Descendants("Id").FirstOrDefault(),
                    host = (string)x.Descendants("Host").FirstOrDefault()
                })
                .ToList();
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56901289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档