XDocument确定父母的最后一个孩子

时间:2012-07-09 20:11:58

标签: c# xml linq-to-xml

使用后代使用XDocument遍历XML文档,我如何确定我是父项的最后一个孩子?

XDocument xmlDoc = XDocument.Parse(xml)

  foreach (var element in xmlDoc.Descendants())
        {
           //Need to determine the last child of the parent and do something here. 
        }

XML的示例以及预期返回的内容。我需要动态地遍历文档而不是指定XPath或Xquery,因为这些将一般用于各种XML文档而不需要了解原因的很多细节...只是想看看我是否可以使用XDocument或者如果有一种更好的方法仍然没有在XPath或XQuery中指定标记名称,除非它可以动态完成而不知道文档可能有多少级别。,

<?xml version="1.0"?>
<Root> 
<Customer>
<CustID>1</CustID>
<Name>Smith, Joe</Name>
<CustomerTransDetail>
<CustID>1</CustID>
<CustTransID>1</CustTransID>
<Note>NA</Note>
</CustomerTransDetail>
<CustomerTransDetail>
<CustID>1</CustID>
<CustTransID>2</CustTransID>
<Note>N/A</Note>
</CustomerTransDetail>
</Customer>
<Customer>
<CustID>2</CustID>
<Name>Smith, Jane</Name>
<CustomerTransDetail>
<CustID>2</CustID>
<CustTransID>1</CustTransID>
<Note>N/A</Note>
</CustomerTransDetail>
<CustomerTransDetail>
<CustID>2</CustID>
<CustTransID>2</CustTransID>
<Note>N/A</Note>
</CustomerTransDetail>
</Customer>
</Root>

我需要知道何时击中父母的最后一个孩子,这样我才能做点什么。因此,每次我点击Name节点或Note节点时,我都可以做一些事情。

2 个答案:

答案 0 :(得分:2)

我仍然不清楚你要做什么,但希望这可以指出你正确的方向。

你正在使用XDocument,所以我假设你至少在.NET 3.5中。您很可能使用Linq to XML扩展方法来实现您想要的目标。

XDocument doc = XDocument.Parse("xmlPath");
foreach (XElement element in doc.Root.Descendants())
{
    bool hasChildren = element.HasElements;
    bool hasSiblings = element.ElementsBeforeSelf().Any() || element.ElementsAfterSelf().Any();
    bool isLastChild = hasSiblings && !element.ElementsAfterSelf().Any();
}

根据遍历节点时需要执行的操作,您可能需要在遍历树时考虑递归。这样你可以随时确定元素是否有兄弟姐妹,是最后一个兄弟等等。

答案 1 :(得分:0)

在没有引入所有布尔值并使用linq查询的情况下,您得到与CB回答相同的结果:

    var query = from element in doc.Descendants()
                where element.ElementsBeforeSelf().Any() && !element.ElementsAfterSelf().Any() 
                select element;

    foreach (XElement element in query)
    {
      // Do something ...
    }