2012-07-09 39 views
3

使用XDocument使用後代遍歷XML文檔如何確定我處於父項的最後一個孩子?XDocument確定父項的最後一個孩子

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

「所以,每當我點擊Name節點或Note節點時,例如我就可以做一些事情。」目前還不清楚爲什麼'Name'節點可以符合條件,因爲在這兩種情況下,在您的示例XML中都有一個兄弟節點。 – dasblinkenlight 2012-07-09 20:29:26

+0

我需要更具體一些......每當我遇到兄弟姐妹或父母而沒有兄弟姐妹時,我需要做一些事情,一旦我到達層次結尾。當我循環時,我想我需要提前閱讀並確認它是否是兄弟姐妹(真正確定它的關係),但不知道如何去做。 – PMOrion 2012-07-09 20:35:31

+0

我沒有明白。你想要每個「Name」節點和每個「Note」節點? – Batuu 2012-07-09 20:47:20

回答

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

根據您在遍歷節點時需要做什麼,您可能需要在走樹時考慮遞歸。你能確定你去的元素是否有兄弟姐妹,這樣是最後一個兄弟等

+0

我很確定這會讓我得到我需要去的地方。我正在尋找XDocument智能讀取XML的方法,以便我可以根據需要注入方法調用。 – PMOrion 2012-07-09 20:59:31

0

你得到相同的結果轉債答案不引入所有的布爾值,並使用LINQ查詢:

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

    foreach (XElement element in query) 
    { 
     // Do something ... 
    } 
相關問題