3

使用后代使用 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>

我需要知道我什么时候打了父母的最后一个孩子,这样我才能做点什么。所以每次我点击名称节点或注释节点时,我都可以做一些事情。

4

2 回答 2

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();
}

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

于 2012-07-09T20:49:36.473 回答
0

在不引入所有布尔值并使用 linq-query 的情况下,您会得到与 CBs 答案相同的结果:

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

    foreach (XElement element in query)
    {
      // Do something ...
    }
于 2012-07-09T21:18:12.477 回答