2011-08-06 19 views
6

XML dosyası biçimine Linq düğümlerin:Seç XML C#

<?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> 

Bütün "loc" düğümleri (element1, Element2), ancak bu işe seçmek istiyor !!! Sorunu şüpheli

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

cevap

12

Eğer document.Elements("url") yerine document.Root.Elements("url") dan gidiyoruz ... yani var olmayan url bir kök eleman arıyor olması.

bu deneyin: loc elemanları zaten url elemanları hemen altındaki tüm oldukları gibi, burada Descendants kullanmadıysanız

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

Not.

sadeceloc unsurları doğru olanlar, zaten olup olmadığını kullanabilirsiniz diğer alternatif adildir:

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

(I urlList önceden boştu tahmin ediyorum ... durumun bu tür için ben tüm işlem için LINQ kullanmayı ve bir koleksiyona ekleyen foreach döngülerini kaldırmayı sever.)

DÜZENLEME: Bu kod benim için çalışır. İşte kısa ama tam program:

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

Merhaba Jon! Kodunu kullandım ama urlList hala boş! :((bir dizeden xml ayrıştırıyorum) –

+0

@Chelsea_cole: Şimdi kontrol ediliyor ... –

+1

@Chelsea_cole: Benim için çalışıyor - Çalıştığını gösteren tam bir program yayınladım. 'dan sonlandırıldığında,' nu kullanın. Lütfen kodumu deneyin ve sonra ne aradığınızı ve ne aradığınızı görün… –

1

bu deneyin:

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

Bu bir IEnumerable > 'döndürecek ne istediğimi sanmıyorum ... –

+0

@Jon Skeet Cevabı güncellendi. – VMAtm

+0

'Descendants()' işlevi, 'SelectMany' kullanılmasına gerek kalmaz - bir' IEnumerable 'ile * başlayan * bir aşırı yüklenme vardır. –