如何遍历节点的交集
how to iterate through intersection of nodes
如何只遍历两个文档之间的公共节点?
现在,我可以遍历文档的所有节点:
var xmlBody = @"<?xml version="1.0" encoding="UTF-8"?>
<Visit>
<Person>...</Person>
<Name>...</Name>
<Color>...</Color>
</Visit>";
var xdoc = XDocument.Parse(xmlBody);
foreach (XElement child in xdoc.Elements())
{//do stuff}
我只想遍历 xdoc.Elements()
和我的 nodeList
:
之间的公共节点
var nodeList = new List<string> { "Name", "LastName", "Color" };
nodeList
和 xdoc
的交集就是这些节点:名称、颜色:
如何迭代交集,像这样
foreach(XElement child in xdoc.Elements().Intersect(nodeList))
您可能应该使用 HashSet
而不是列表,然后您可以使用以下 Linq 根据本地名称过滤掉节点
var nodeNames = new HashSet<string> { "Name", "LastName", "Color" };
foreach(var child in xdoc.Elements().Where(e => nodeNames.Contains(e.Name.LocalName)))
{
// Your code here.
}
我会像这样使用 Linq Where 和 Contains:
var xmlBody = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<Visit>
<Person>...</Person>
<Name>...</Name>
<Color>...</Color>
</Visit>";
var xdoc = XDocument.Parse(xmlBody);
var nodeList = new List<string> { "Name", "LastName", "Color" };
var intersectedElements = xdoc.Elements()
.First() //<Visit>
.Elements()
.Where(element => nodeList.Contains(element.Name.LocalName));
foreach (XElement child in intersectedElements)
{
Console.WriteLine($"{child.Name.LocalName}: {child.Value}");
}
如果你想要嵌套得比使用 Descendants 更深的元素。
var intersectedNestedElements = xdoc.Descendants()
.Where(element => nodeList.Contains(element.Name.LocalName));
foreach (XElement child in intersectedNestedElements)
{
Console.WriteLine($"{child.Name.LocalName}: {child.Value}");
}
两者输出:
Name: ...
Color: ...
如何只遍历两个文档之间的公共节点?
现在,我可以遍历文档的所有节点:
var xmlBody = @"<?xml version="1.0" encoding="UTF-8"?>
<Visit>
<Person>...</Person>
<Name>...</Name>
<Color>...</Color>
</Visit>";
var xdoc = XDocument.Parse(xmlBody);
foreach (XElement child in xdoc.Elements())
{//do stuff}
我只想遍历 xdoc.Elements()
和我的 nodeList
:
var nodeList = new List<string> { "Name", "LastName", "Color" };
nodeList
和 xdoc
的交集就是这些节点:名称、颜色:
如何迭代交集,像这样
foreach(XElement child in xdoc.Elements().Intersect(nodeList))
您可能应该使用 HashSet
而不是列表,然后您可以使用以下 Linq 根据本地名称过滤掉节点
var nodeNames = new HashSet<string> { "Name", "LastName", "Color" };
foreach(var child in xdoc.Elements().Where(e => nodeNames.Contains(e.Name.LocalName)))
{
// Your code here.
}
我会像这样使用 Linq Where 和 Contains:
var xmlBody = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<Visit>
<Person>...</Person>
<Name>...</Name>
<Color>...</Color>
</Visit>";
var xdoc = XDocument.Parse(xmlBody);
var nodeList = new List<string> { "Name", "LastName", "Color" };
var intersectedElements = xdoc.Elements()
.First() //<Visit>
.Elements()
.Where(element => nodeList.Contains(element.Name.LocalName));
foreach (XElement child in intersectedElements)
{
Console.WriteLine($"{child.Name.LocalName}: {child.Value}");
}
如果你想要嵌套得比使用 Descendants 更深的元素。
var intersectedNestedElements = xdoc.Descendants()
.Where(element => nodeList.Contains(element.Name.LocalName));
foreach (XElement child in intersectedNestedElements)
{
Console.WriteLine($"{child.Name.LocalName}: {child.Value}");
}
两者输出:
Name: ...
Color: ...