使用linq查找嵌套列表中的最后一条记录
我有一个类似这样的嵌套xml使用linq查找嵌套列表中的最后一条记录,linq,Linq,我有一个类似这样的嵌套xml < H> < FP > < Name="FP1"/> < R > < Name = "R1"/> < O> < Name="O1"/> < /O> < O> < Name
< H>
< FP >
< Name="FP1"/>
< R >
< Name = "R1"/>
< O>
< Name="O1"/>
< /O>
< O>
< Name="O2"/>
< /O>
< /R>
< R>
< Name = "R2"/>
< O>
< Name="O4"/>
< /O>
< /R>
< /FP>
< FP>
< Name="FP2" />
< R>
< Name = "R3"/>
< O>
< Name="O5"/>
< /O>
< O>
< Name="O6"/>
< /O>
< /R>
< /FP>
< R>
< Name="R4"/>
< O>
< Name="O7"/>
< /O>
< O>
< Name="O8"/>
< /O>
< /R>
< R>
< Name="R5"/>
< O >
< Name="O9"/>
< /O>
< /R>
< /H>
我正在使用反序列化来读取此xml
这是我的反序列化类:
[XmlRoot("H")]
public class ReplyH
{
[XmlElement("FP")]
public List<ReplyFP> FPs;
[XmlElement("R")]
public List<ReplyR> Rs;
}
public class ReplyFP
{
[XmlElement("Name")]
public string Name;
[XmlElement("R")]
public List<ReplyR> Rs = new List<ReplyR>();
}
public class ReplyR
{
[XmlElement("Name")]
public string Name;
[XmlElement("O")]
public List<ReplyO> Os = new List<ReplyO>();
}
public class ReplyO
{
[XmlElement("Name")]
public string Name;
}
[XmlRoot(“H”)]
公共类回复
{
[XmlElement(“FP”)]
公开名单FPs;
[XmlElement(“R”)]
公开名单;
}
公共类应答
{
[XmlElement(“名称”)]
公共字符串名称;
[XmlElement(“R”)]
公共列表Rs=新列表();
}
公共类应答器
{
[XmlElement(“名称”)]
公共字符串名称;
[XmlElement(“O”)]
公共列表Os=新列表();
}
公共类回复
{
[XmlElement(“名称”)]
公共字符串名称;
}
我需要迭代O标记
类似于foreach(H.FP.R.O中的varo)和foreach(H.R.O中的varo)
1) 。我需要找到上面示例中的最后一个
标记
。
2). 我还需要获取父项
R名称和
FP名称(如果存在特定的
O)`
如何使用linq/lambda表达式获得此结果
谢谢这里使用Xml。Linq:更新另请参见
使用System.Linq;
使用System.Xml.Linq;
使用System.Xml.XPath;
使用制度;
公共类的东西
{
公共静态void Main(字符串[]args)
{
var doc=XDocument.Parse(xml);
var last=doc.Root
.XPathSelectElements(“//H/FP/R/O |//H/R/O”)
.Last();
控制台写入线(最后一个);
WriteLine(“父R的名称为“{0}”,last.Parent.Attribute(“name”).Value);
var grandad=last.Parent.Parent;
if(granddad.Name==“FP”)
WriteLine(“父FP的名称为“{0}”,grandad.Attribute(“name”).Value);
}
常量字符串xml=@“
";
}
输出
<O Name="O6" />
Parent R has name 'R3'
Parent FP has name 'FP2'
父R的名称为“R3”
父FP的名称为“FP2”
如果从XML中取消注释最后一节:
输出变为:
<O Name="O9" />
Parent R has name 'R5'
父R的名称为“R5”
对于更新的问题,使用Linq To对象更新的答案
代码没有LINQtoXMLFalvour那么优雅,但它可以工作
注释
ReplyH
中遵循FPs,如代码所示(示例XML似乎也给出了建议)[XmlAttribute("Name")] public string Name;
它(意外地)在您的问题中说了xmlement(“名称”)
O9
Parent R has name 'R5'
我能看看你的反序列化代码吗?我想知道数据反序列化后采用什么形式。我用要反序列化的类更新了问题。这只是一个庞大的xml和一个庞大的反序列化类的一部分。因此,我现在无法更改为使用linq to xml:(希望有办法out@user1186390我已经为您提供了更新的问题。非常感谢您的回复。至于您在上面发布的linq to object答案,我确实有
O6
Parent R has name 'R3'
Parent FP has name 'FP2'
O9
Parent R has name 'R5'