2009-08-04 12 views
17
Dim xml = <Root> 
      <Parent id="1"> 
       <Child>Thomas</Child> 
      </Parent> 
      <Parent id="2"> 
       <Child>Tim</Child> 
       <Child>Jamie</Child> 
      </Parent> 
      </Root> 

Dim parents = xml.Elements 

इस मामले में, children में सभी अभिभावक तत्व और सभी बाल तत्व शामिल हैं। को केवल<Root> के प्रत्यक्ष वंशजों को पकड़ने का सबसे अच्छा तरीका क्या है?LINQ से XML: मैं XElement के केवल प्रत्यक्ष वंशज कैसे प्राप्त करूं?

क्या मुझे एक LINQ क्वेरी लिखनी चाहिए जो तत्वों का चयन करे जहां parent = <Root>? या क्या कुछ अंतर्निहित विधि है जो मुझे याद आ रही है जो यह मेरे लिए प्राप्त कर सकती है?

संपादित करें: मुझे XElement.Elements और XElement.Descendants के बीच कुछ भ्रम था। चूंकि रूबेन बार्टिलिंक ने बताया, XElement.Elements मुझे वही देगा जो मैं ढूंढ रहा था।

+0

क्या आप वास्तविक अवतार में संपादित कर सकते हैं जिसका उपयोग आप समाप्त कर चुके हैं? बीटीडब्ल्यू कृपया LINQPAd डाउनलोड करें और इसे आजमाएं - इस तरह की सामग्री परीक्षण के लिए यह बहुत अच्छा है। Http://www.dimecasts.net/Casts/ByTag/LinqPad –

उत्तर

17

Exec सारांश - आप चाहते हैं:

xml.Elements.Select(function(element) new XElement(element.Name,element.Attributes)) 

पहले जवाब:

XElement.Descendants, या यह एक चाल सवाल है? : पी There's an example of usage of Descendants here

संशोधित जवाब, धन्यवाद Tormod - कुछ गलत महसूस किया !:

तत्वों प्रत्यक्ष सन्तान देता है, आप देख रहे हैं के रूप में। Descendants पूर्ण पदानुक्रम देता है [जैसा कि आप तत्वों का आरोप लगा रहे हैं]। ।!

Dim xml = <Root> 
     <Parent id="1"> 
      <Child>Thomas</Child> 
     </Parent> 
     <Parent id="2"> 
      <Child>Tim</Child> 
      <Child>Jamie</Child> 
     </Parent> 
     </Root> 

REM All nodes two levels down in the hierarchy 
Dim level2Nodes = xml.Elements.SelectMany(function(element) element.Elements) 
level2Nodes.Dump 

REM All Child nodes, no matter where they are: 
Dim children = xml.Descendants("Child") 

प्रत्येक जिनमें से आप निकलेगा: (उदाहरण मैं जुड़ा हुआ भ्रम के लिए यह स्पष्ट क्षमा याचना करता है

तो, अंत में, क्या आप देख रहे हैं) वीबी में (इस समय है 3 `` `(वीबी बयान मोड में ऊपर पेस्ट सीधे LINQPad में) Rems में शामिल के रूप में विभिन्न कारणों के लिए तत्वों

मैं अब देखते हैं कि क्या आप भ्रमित किया जा सकता है -। जब आप तत्वों का उपयोग करें और देखने के लिए एक विज़ुअलाइज़र में, आप अभी भी हैं बच्चों को देखकर: -:

Dim parentNames = xml.Elements.Select(function(element) element.Name) 

ध्यान दें कि इन मामलों में से प्रत्येक में, आप दो परिणाम दे रहे हैं

Dim parents = xml.Elements 

केवल वास्तविक नाम चाहते हैं, आप की तरह कुछ का उपयोग कर सकते हैं।

तुम सच में chidren उन्हें हटाना चाहते हैं, तो आप चाहते हैं:

Dim parentElements = xml.Elements.Select(function(element) new XElement(element.Name,element.Attributes)) 

आप को दिखाने के लिए आप वास्तव में क्या देख रहे हैं अपने प्रश्न का विस्तार कर सकते हैं?

+3

पर उदाहरण देखें Descendants() विधि सभी वंशजों को प्राप्त करता है, न केवल प्रत्यक्ष वंशज। इस मामले में, "रूट" के वंशजों में सभी बाल तत्व भी शामिल होंगे। – Tormod

+0

@ टॉर्मोड, आपको यकीन है? उदाहरण देखें? यदि नहीं, descendants और तत्वों के बीच अंतर क्या है? –

+0

@ टॉर्मोड, मी culpa, संपादन! –

-1

XPath का उपयोग क्यों नहीं करें?

Dim myXML As var = New XmlDocument() 
myXML.Load(myXML.xml) 

For Each node As XmlNode In myXML.SelectNodes("//") 
    Dim myVar As var = node.SelectSingleNode("Parent").InnerText 
Next 

इसे नमक के चुटकी से लें - मैंने इसे सी # से वीबी में परिवर्तित कर दिया है।

+0

XLinq यह काफी अच्छी तरह से करता है [एक बार जब किसी का उपयोग करने के तरीके की पुष्टि हो जाती है: पी] –

+1

पर्याप्त मेला: पी मुझे इसे देखना होगा, मुझे लगता है कि यदि आप सभी आगे बढ़ रहे हैं तो XPath पुराना हो रहा है XLinq पर! –

0

यदि सभी प्रत्यक्ष वंशजों का एक ही ज्ञात तत्व नाम होता है, और यह तत्व नाम किसी अन्य स्तर पर प्रकट नहीं हो सकता है, तो आप xml.Descendants ("parent") का उपयोग कर सकते हैं।

15

XElement.Elements बाल तत्वों का संग्रह प्राप्त करता है। उदाहरण के लिए ...

var s = @"<root> 
      <e1> 
       <e2> 
       </e2> 
      </e1> 
      <e1> 
       <e2> 
       </e2> 
      </e1> 
      <e1> 
       <e2> 
       </e2> 
      </e1> 
      </root>"; 

var doc = XElement.Load(new StringReader(s)); 

Console.WriteLine(doc.Elements().Count()); // 3 
Console.WriteLine(doc.Descendants().Count()); //6 
2

LINQ का उपयोग कर हम ऐसा कर सकते हैं।

string s = "<Root><Parent id=\"1\"><Child>Thomas</Child></Parent><Parent id=\"2\"><Child>Tim</Child><Child>Jamie</Child></Parent></Root>"; 
XDocument xdoc = XDocument.Parse(s); 
foreach (XElement DirectChild in xdoc.Descendants().Where(child => child.Parent == xdoc.Root)) 
{ 
//Do stuff here 
} 

उम्मीद है कि इससे मदद मिलती है। धन्यवाद।

संबंधित मुद्दे