使用 xdoc 查找特定顶级元素中的多个子后代元素
Using xdoc to find multiple sub descendant elements within a specific top elements
我有这种 xml 文件,我正在尝试获取每个组的 ID 和主机。
<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
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 和主机。
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
您可以通过在 group
上调用 ElementsAfterSelf
来获取对 <CCC>
元素的引用。这将打印两个组:
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);
}
尝试以下操作:
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();
}
}
}
我有这种 xml 文件,我正在尝试获取每个组的 ID 和主机。
<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
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 和主机。
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
您可以通过在 group
上调用 ElementsAfterSelf
来获取对 <CCC>
元素的引用。这将打印两个组:
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);
}
尝试以下操作:
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();
}
}
}