2011-08-06 8 views
6

XML फ़ाइल स्वरूप के लिए Linq नोड:करें Xml सी #

<?xml version="1.0" encoding="UTF-8"?> 
    <urlset>  
     <url> 
      <loc>element1</loc> 
      <changefreq>daily</changefreq> 
      <priority>0.2</priority> 
     </url> 
     <url> 
      <loc>element2</loc> 
      <changefreq>daily</changefreq> 
      <priority>0.2</priority> 
     </url> 
    <urlset> 

मैं सभी "loc" नोड्स (element1, element2), लेकिन यह काम नहीं चयन करना चाहते हैं !!!

foreach (XElement item in document.Elements("url").Descendants("loc")) // Change into what? 
{ 
     urlList.Add(item.Value); 
} 

उत्तर

12

मैं इस समस्या संदेह है कि आप document.Elements("url") बजाय document.Root.Elements("url") से जा रहे हैं ... तो यह url के जड़ तत्व है, जो अस्तित्व में नहीं है की तलाश में है।

इस प्रयास करें:

List<string> urlList = doc.Root.Elements("url") 
           .Elements("loc") 
           .Select(x => (string) x) 
           .ToList(); 

ध्यान दें कि मैं Descendants यहाँ उपयोग नहीं किया है, के रूप में loc तत्वों वैसे भी url तत्वों के ठीक नीचे सभी कर रहे हैं।

एक अन्य विकल्प अगर केवलloc तत्वों सही हैं वैसे भी हैं, तो आप इस्तेमाल कर सकते हैं बस है: स्थिति की इस तरह के लिए

List<string> urlList = doc.Descendants("loc") 
          .Select(x => (string) x) 
          .ToList(); 

(मैं यह सोचते हैं रहा हूँ urlList पहले से खाली था ... मैं पूरे ऑपरेशन के लिए LINQ का उपयोग करना और foreach लूप को समाप्त करना जो सिर्फ संग्रह में जोड़ रहे हैं।)

संपादित करें: कोड मेरे लिए काम करता है। यहाँ एक छोटा लेकिन पूरा कार्यक्रम है:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Xml.Linq; 

class Test 
{ 
    static void Main(string[] args) 
    { 
     string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?> 
    <urlset>  
     <url> 
      <loc>element1</loc> 
      <changefreq>daily</changefreq> 
      <priority>0.2</priority> 
     </url> 
     <url> 
      <loc>element2</loc> 
      <changefreq>daily</changefreq> 
      <priority>0.2</priority> 
     </url> 
    </urlset>"; 

     XDocument doc = XDocument.Parse(xml); 
     List<string> urlList = doc.Root 
            .Elements("url") 
            .Elements("loc") 
            .Select(x => (string) x) 
            .ToList(); 
     Console.WriteLine(urlList.Count); 
    } 
} 
+0

हाय जॉन! मैंने आपका कोड इस्तेमाल किया लेकिन मेरा यूआरएललिस्ट अभी भी खाली है! :((मैं एक स्ट्रिंग से xml पार्स)। –

+0

@Chelsea_cole: अब जांच रहा है ... –

+1

@Chelsea_cole: मेरे लिए काम करता है - मैंने इसे पूरा करने वाला एक पूरा कार्यक्रम पोस्ट किया है। ध्यान दें कि मुझे अपना मूल एक्सएमएल ठीक करना था, '' से 'के अंत में। कृपया मेरा कोड आज़माएं, और फिर देखें कि इसके बीच क्या अंतर है और आप क्या प्रयास कर रहे थे ... –

1

इस प्रयास करें:

var query = for x in xDoc.Descendants("url") 
      select (string)x.Element("loc"); 

foreach (string loc in query) 
{ 
    urlList.Add(loc); 
} 
3
var xDoc = XDocument.Parse(
    @"<urlset>  
     <url> 
      <loc>element1</loc> 
      <changefreq>daily</changefreq> 
      <priority>0.2</priority> 
     </url> 
     <url> 
      <loc>element2</loc> 
      <changefreq>daily</changefreq> 
      <priority>0.2</priority> 
     </url> 
    </urlset>"); 
var locElements = xDoc.Descendants("url").SelectMany(el => el.Descendants("loc")); 
+0

वह एक 'IENumerable >' जो मुझे नहीं लगता है वह वही होगा जो ... चाहता था ... –

+0

@ जोन स्कीट ने उत्तर अपडेट किया। – VMAtm

+0

जिस तरह से 'descendants() 'काम करता है,' SelectMany' का उपयोग करने की कोई आवश्यकता नहीं है - एक अधिभार है जो' Inumerable 'के साथ * शुरू होता है। –