Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XDocument确定父级的最后一个子级_C#_Xml_Linq To Xml - Fatal编程技术网

C# XDocument确定父级的最后一个子级

C# XDocument确定父级的最后一个子级,c#,xml,linq-to-xml,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示例以及预期返回的内容。

使用子体遍历带有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>

1.
史密斯,乔
1.
1.
NA
1.
2.
不适用
2.
史密斯,简
2.
1.
不适用
2.
2.
不适用

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

我还是有点不清楚你想做什么,但希望这能为你指明正确的方向

您使用的是XDocument,所以我假设您至少在.NET3.5中。您最有可能使用Linq到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();
}

取决于在遍历节点时需要做什么,在遍历树的过程中可能需要考虑递归。通过这种方式,您可以在运行时确定元素是否有同级,是否是最后一个同级,等等。

您可以获得与CBs答案相同的结果,而无需引入所有布尔值并使用linq查询:

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

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

“因此,每次我点击名称节点或注释节点,例如,我可以做一些事情”不清楚为什么
Name
节点会符合条件,因为在示例XML中,在这两种情况下,它后面都有一个同级节点。我需要更具体一点。。。当我到达层次结构的末尾时,每次遇到兄弟姐妹或没有兄弟姐妹的父母时,我都需要做一些事情。当我在循环时,我想我需要提前阅读并确认它是否是兄弟姐妹(真正确定它的关系),只是不确定如何进行。我没有理解。你想要每一个“名字”节点和每一个“音符”节点吗?我很确定这会让我到达我需要去的地方。我正在寻找一种让XDocument智能地读取XML的方法,这样我就可以根据需要插入方法调用。