使用后代使用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节点时,我都可以做一些事情。
答案 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 ...
}