2011-04-25 12 views
8

मैं एक एक्सएमएललिंक और एक्स डॉक्यूमेंट का उपयोग करके, क्या मैं सभी बाल तत्वों को मूल टैग के तहत प्राप्त कर सकता हूं?

<data> 
    <summary> 
    <account curr_desc='USD' acct_nbr='123' net='1000.00' /> 
    <account curr_desc='USD' acct_nbr='456' net='2000.00' /> 
    </summary> 
    <details> 
    <accounts> 
     <account acct_nbr="123" curr="USD"> 
     <activity color='False' settle_date='02 Jul 2010' amt='580.00' /> 
     <activity color='True' settle_date='09 Jul 2010' amt='420.00' /> 
     </account> 
     <account acct_nbr="456" curr="USD"> 
     <activity color='True' settle_date='12 Dec 2010' amt='1500.00' /> 
     <activity color='True' settle_date='19 Dec 2010' amt='500.00' /> 
     </account> 
    </accounts> 
    </details> 
</data> 

Linq और XDocument का उपयोग करना, मैं "सारांश" जानकारी निकाल सकता है, लेकिन मैं कैसे निकाल सकते हैं "सारांश" टैग के अंतर्गत "खाता" जानकारी?

XDocument XMLDoc = XDocument.Load("testdata.xml"); 
XElement accounts = (from xml2 in XMLDoc.Descendants("summary") 
        select xml2).FirstOrDefault(); 

कैसे इतना है कि यह <summary> के तहत मुझे सभी तत्वों रिटर्न मैं "summary/account" की तरह कुछ निर्दिष्ट कर सकते हैं? ध्यान दें, मेरे पास <account><detail><accounts> के तहत है, मैं केवल सारांश टैग के अंतर्गत तत्व चाहता हूं।

संपादित करें: (एंड्रयू से समाधान)

var accounts = XMLDoc.Root.Elements("summary").Elements("account"); 
foreach (XElement elem in accounts) 
{ 
    sb.Append(elem.ToString()); 
} 
+0

आपको लिंककैड की जांच करनी चाहिए, यह आपको इस तरह की चीज को फ्लाई पर जांचने देती है। इसकी साफ :) –

+0

'x में से' लिख रहा है ... x का चयन करें बेकार है। सीधे 'इन' के बाद कोड लिखें। – svick

+0

2 एसविक, आप वास्तव में सही हैं .. मैंने उसे नोटिस नहीं किया। मैंने अब कोड अपडेट किया है :) धन्यवाद! –

उत्तर

18

आप Elements विधि का उपयोग करना चाहिए सुझाव दिया, लेकिन आम तौर पर आपको केवल यह करना चाहिए जब आप वास्तव में किसी दिए गए नाम के साथ सभी वंशजों को ढूंढना चाहते हैं, न केवल तत्काल बच्चों को। अन्यथा आपका कोड बहुत सारी खोज करता है जिसे इसकी आवश्यकता नहीं होती है, और ऐसे तत्व लौटा सकते हैं जिन्हें आप नहीं चाहते हैं।

+0

ओह ... मुझे यह भी एहसास नहीं हुआ कि वह 'तत्वों 'की बजाय' descendants' का उपयोग कर रहा था !!! –

+0

मेरा जवाब तय किया गया, और इसे नोट करने के लिए +1; 'Descendants' इस मामले में काम करेगा, लेकिन अगर अन्य नामों के साथ अन्य तत्व थे तो यह खराब परिणाम हो सकता है। –

3
var accountSummaryElems = 
    XMLDoc.Element("summary").Elements("account"); 

यह आपको summary तत्व के तहत account तत्वों का एक संग्रह प्रदान करता है। फिर आप मूल्य प्राप्त करने के लिए उन्हें फिर से शुरू कर सकते हैं।

उसी पैटर्न का उपयोग करने के लिए संपादित किया गया था; मैं FirstOrDefault() के बजाय First() पर कॉल करता हूं क्योंकि यदि "खाता" तत्व नहीं मिला है तो वह कोड तब तक नहीं चलेगा।

फिर आपके पास वापस संग्रह पर पुन: प्रयास करने का सही विचार है। ,

var accounts = doc.XPathSelectElements("/data/summary/account"); 

इस उदाहरण में आप भी Descendants उपयोग कर सकते हैं एंड्रयू नाई के रूप में:

var accounts = doc.Root.Elements("summary").Elements("account"); 

या, वैकल्पिक रूप से, XPathSelectElements, जो इस मामले में है सरल:

+0

धन्यवाद एंड्रयू। मुझे लगता है कि परिणाम प्राप्त करने के लिए मैं आपके समाधान का उपयोग करने में सक्षम हूं। मैं अपनी मूल पोस्ट संपादित कर रहा हूं। अगर आप मान्य कर सकते हैं तो सराहना करें। –

+0

मैंने अपनी मूल पोस्ट में एक त्रुटि की; मैं सही करने के लिए संपादन कर रहा हूँ। –

+0

मैंने समाधान पोस्ट किया है .. क्या आप कृपया सत्यापित कर सकते हैं। आपकी सहायता की सराहना। –