gpt4 book ai didi

c# - 根据 C# LINQ 中的子节点 XML 获取特定的父节点

转载 作者:数据小太阳 更新时间:2023-10-29 02:55:47 25 4
gpt4 key购买 nike

我有一个很长的 XML,它的父节点是 sdnEntry,每个父节点都有它的子节点 sdnType,它定义了条目的类型。 我试图只将具有 sdnType 的节点设置为 Individual

我的 xml 的简短示例在这里;

<sdnEntry>
<uid>6905</uid>
<lastName>abc</lastName>
<sdnType>Entity</sdnType> // type is entity

<akaList>
<aka>
<uid>4741</uid>
<type>a.k.a.</type>
<category>strong</category>
<lastName>ABC</lastName>
<firstName>ABCCCC</firstName>
</aka>
<aka>
<uid>4742</uid>
<type>a.k.a.</type>
<category>weak</category>
<lastName>ADCS</lastName>
</aka>
</akaList>

<nationalityList>
<nationality>
<uid>5416</uid>
<country>XYZ</country>
<mainEntry>true</mainEntry>
</nationality>
</nationalityList>
</sdnEntry>

<sdnEntry>
<uid>6905</uid>
<lastName>abc</lastName>
<sdnType>Individual</sdnType> // type is individual

<akaList>
<aka>
<uid>4741</uid>
<type>a.k.a.</type>
<category>strong</category>
<lastName>ABC</lastName>
<firstName>ABCCCC</firstName>
</aka>
<aka>
<uid>4742</uid>
<type>a.k.a.</type>
<category>weak</category>
<lastName>ADCS</lastName>
</aka>
</akaList>

<nationalityList>
<nationality>
<uid>5416</uid>
<country>XYZ</country>
<mainEntry>true</mainEntry>
</nationality>
</nationalityList>
</sdnEntry>

<sdnEntry>
<uid>6905</uid>
<lastName>abc</lastName>
<sdnType>Individual</sdnType>

<akaList>
<aka>
<uid>4741</uid>
<type>a.k.a.</type>
<category>strong</category>
<lastName>ABC</lastName>
<firstName>ABCCCC</firstName>
</aka>
<aka>
<uid>4742</uid>
<type>a.k.a.</type>
<category>weak</category>
<lastName>ADCS</lastName>
</aka>
</akaList>

<nationalityList>
<nationality>
<uid>5416</uid>
<country>XYZ</country>
<mainEntry>true</mainEntry>
</nationality>
</nationalityList>
</sdnEntry>

<sdnEntry>
<uid>6905</uid>
<lastName>abc</lastName>
<sdnType>Entity</sdnType>

<akaList>
<aka>
<uid>4741</uid>
<type>a.k.a.</type>
<category>strong</category>
<lastName>ABC</lastName>
<firstName>ABCCCC</firstName>
</aka>
<aka>
<uid>4742</uid>
<type>a.k.a.</type>
<category>weak</category>
<lastName>ADCS</lastName>
</aka>
</akaList>

<nationalityList>
<nationality>
<uid>5416</uid>
<country>XYZ</country>
<mainEntry>true</mainEntry>
</nationality>
</nationalityList>
</sdnEntry>

我的代码是这样的,但是我得到了错误;

 var lXelements = XElement.Parse(xml);
var lParentNode = "sdnEntry";
if (lParentNode == "sdnEntry")
{
//lXelements = (XElement)lXelements.Descendants("sdnType").Where(x => x.Name.LocalName == "Individual");
lXelements = (XElement)lXelements.Descendants("sdnType").Where(x => (string)x.Value == "Individual");
}

我目前遇到转换错误,我不知道我的这段代码是否会给我想要或不想要的结果。

错误:

Additional information: Unable to cast object of type 'WhereEnumerableIterator`1[System.Xml.Linq.XElement]' to type 'System.Xml.Linq.XElement'.

最佳答案

错误是因为您正在尝试重新分配 Linq Where结果为 XElement .

除此之外,您基本上想要获得所有 <sdnEntry>有子节点的节点 <sdnType>Individual</sdnType>

XElement elements = XElement.Parse(xml);
var parentNode = "sdnEntry";
var childNode = "sdnType";
var childNodeValue = "Individual";
List<XElement> entries = elements
.Descendants(parentNode)
.Where(parent => parent.Descendants(childNode)
.Any(child => child.Value == childNodeValue)
).ToList();

entries应仅包含与提供的子元素过滤器匹配的所需父元素。

上面的方法是根据父节点搜索子节点。

下面的做法是先找到子节点,再查找父节点的树

List<XElement> entries = elements
.Descendants(childNode)
.Where(child => child.Value == childNodeValue)
.SelectMany(child => child.Ancestors(parentNode))
.ToList();

两种方法都基于以下 XML 生成相同的 2 个匹配元素结果

var xml = @"
<sdnList>
<sdnEntry>
<uid>6905</uid>
<lastName>abc</lastName>
<sdnType>Entity</sdnType>

<akaList>
<aka>
<uid>4741</uid>
<type>a.k.a.</type>
<category>strong</category>
<lastName>ABC</lastName>
<firstName>ABCCCC</firstName>
</aka>
<aka>
<uid>4742</uid>
<type>a.k.a.</type>
<category>weak</category>
<lastName>ADCS</lastName>
</aka>
</akaList>

<nationalityList>
<nationality>
<uid>5416</uid>
<country>XYZ</country>
<mainEntry>true</mainEntry>
</nationality>
</nationalityList>
</sdnEntry>

<sdnEntry>
<uid>6905</uid>
<lastName>abc</lastName>
<sdnType>Individual</sdnType>

<akaList>
<aka>
<uid>4741</uid>
<type>a.k.a.</type>
<category>strong</category>
<lastName>ABC</lastName>
<firstName>ABCCCC</firstName>
</aka>
<aka>
<uid>4742</uid>
<type>a.k.a.</type>
<category>weak</category>
<lastName>ADCS</lastName>
</aka>
</akaList>

<nationalityList>
<nationality>
<uid>5416</uid>
<country>XYZ</country>
<mainEntry>true</mainEntry>
</nationality>
</nationalityList>
</sdnEntry>

<sdnEntry>
<uid>6905</uid>
<lastName>abc</lastName>
<sdnType>Individual</sdnType>

<akaList>
<aka>
<uid>4741</uid>
<type>a.k.a.</type>
<category>strong</category>
<lastName>ABC</lastName>
<firstName>ABCCCC</firstName>
</aka>
<aka>
<uid>4742</uid>
<type>a.k.a.</type>
<category>weak</category>
<lastName>ADCS</lastName>
</aka>
</akaList>

<nationalityList>
<nationality>
<uid>5416</uid>
<country>XYZ</country>
<mainEntry>true</mainEntry>
</nationality>
</nationalityList>
</sdnEntry>

<sdnEntry>
<uid>6905</uid>
<lastName>abc</lastName>
<sdnType>Entity</sdnType>

<akaList>
<aka>
<uid>4741</uid>
<type>a.k.a.</type>
<category>strong</category>
<lastName>ABC</lastName>
<firstName>ABCCCC</firstName>
</aka>
<aka>
<uid>4742</uid>
<type>a.k.a.</type>
<category>weak</category>
<lastName>ADCS</lastName>
</aka>
</akaList>

<nationalityList>
<nationality>
<uid>5416</uid>
<country>XYZ</country>
<mainEntry>true</mainEntry>
</nationality>
</nationalityList>
</sdnEntry>
</sdnList>
";

关于c# - 根据 C# LINQ 中的子节点 XML 获取特定的父节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50167560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com