使用linq查找嵌套列表中的最后一条记录

使用linq查找嵌套列表中的最后一条记录,linq,Linq,我有一个类似这样的嵌套xml < H> < FP > < Name="FP1"/> < R > < Name = "R1"/> < O> < Name="O1"/> < /O> < O> < Name

我有一个类似这样的嵌套xml

 < 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那么优雅,但它可以工作

注释

  • 由于FPs和Rs在顶层处于不同的集合中,因此无法知道它们在源XML中的文档顺序。我假设Rs在
    ReplyH
    中遵循FPs,如代码所示(示例XML似乎也给出了建议)
  • 我必须修复要使用的序列化类

    [XmlAttribute("Name")] public string Name;
    
    它(意外地)在您的问题中说了
    xmlement(“名称”)

  • 或者在取消注释最后一块XML之后:

    O9
    Parent R has name 'R5'
    

    我能看看你的反序列化代码吗?我想知道数据反序列化后采用什么形式。我用要反序列化的类更新了问题。这只是一个庞大的xml和一个庞大的反序列化类的一部分。因此,我现在无法更改为使用linq to xml:(希望有办法out@user1186390我已经为您提供了更新的问题。非常感谢您的回复。至于您在上面发布的linq to object答案,我确实有的随机顺序,因此不一定遵循标记。因此,这里的解决方案可能不起作用。对于linq to xml,我在g这是Win 8 metro风格的应用程序,看起来没有System.xml.xpath。这会杀死它。如果排序有问题,请更改序列化类,这是无法解决的。@user1186390关于“谢谢”-在上,如果您发现一个答案有帮助,请向上投票;如果它解决了您的问题,请接受它:@user1186390这完全回答了您的问题。如果您意识到应该维护排序,那么您的XSD/序列化类仍然存在问题。我认为这个答案解决了这个问题(示例清楚地说明了这一点)。谢谢你的帮助。如果R中没有,我将添加一个虚拟FP,这样我仍然可以使用上面的解决方案来获取父级和父级父级。
    O6
    Parent R has name 'R3'
    Parent FP has name 'FP2'
    
    O9
    Parent R has name 'R5'