2011-08-06 4 views
6

XML 파일 형식으로 Linq에 노드 :선택하여 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> 

내가 모든 "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루트 요소을 찾고 있다는 점이다.

이를 시도해보십시오 loc 요소 어쨌든 url 요소 바로 아래에 모두 같은 내가 여기 Descendants을 사용하지 않은

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

참고.

loc 요소는 바로 사람이 어쨌든있는 경우 사용할 수있는 또 다른 방법은 다음과 같습니다

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

는 (나는 urlList 미리 비어 있으리라 믿고있어 ... 상황이 이런 종류의 내가 전체 작업에 LINQ를 사용하고 컬렉션에만 추가하는 foreach 루프를 제거하는 것이 좋습니다.

EDIT :이 코드는 저에게 효과적입니다. 다음은 짧지 만 완전한 프로그램입니다 :

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

안녕 존! 귀하의 코드를 사용하지만 내 urlList는 여전히 비어 있습니다! :(문자열을 XML로 파싱합니다.) –

+0

@Chelsea_cole : 지금 확인 중 ... –

+1

@Chelsea_cole : 저의 작품 - 작동하는 모습을 보여주는 완전한 프로그램을 게시했습니다. 원본 XML을 수정해야한다는 점에 유의하십시오. ''끝에서''로 변경하십시오. 내 코드를 시도한 다음 시도한 것과 그 차이점을 확인하십시오. –

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

@Jon Skeet 대답을 업데이트했습니다. – VMAtm

+0

'Descendants()'가 작동하는 방식으로,'SelectMany'를 사용할 필요가 없습니다 - IEnumerable 으로 * 시작하는 오버로드가 있습니다. –

관련 문제