2012-07-11 2 views
0

특정 채널에서 업로드 된 모든 비디오가 포함 된 XML 파일을 구문 분석하려고합니다. URL <media:content> 노드 중 하나에서 URL 속성 값을 가져 와서 ViewerLocation 필드에 넣으려고합니다. 그러나 그들 중 몇 가지가 있습니다. 내 현재 코드는 이것이다 :Linq에서 XML에 올바른 노드 가져 오기

var videos = from xElem in xml.Descendants(atomNS + "entry") 
select new YouTubeVideo() 
{ 
    Title = xElem.Element(atomNS + "title").Value, 
    Description = xElem.Element(atomNS + "content").Value, 
    DateUploaded = xElem.Element(atomNS + "published").Value, 
    ThumbnailLocation = xElem.Element(mediaNS + "group").Element(mediaNS + "content").Attribute("url").Value, 
    ViewerLocation = xElem.Element(mediaNS + "group").Element(mediaNS + "content").Attribute("url").Value 
}; 

그것은 나에게 이름 <media:content> 사용자가 예상하는대로와 항목에 대한 XML의 첫 번째 노드를 가져옵니다. 그러나 XML의 첫 번째 항목은 내가 원하는 것이 아닙니다. 나는 두 번째를 원해.

다음은 관련 XML입니다.

<!-- I currently get the value held in this node --> 
<media:content 
    url='http://www.youtube.com/v/ZTUVgYoeN_b?f=gdata_standard...' 
    type='application/x-shockwave-flash' medium='video' 
    isDefault='true' expression='full' duration='215' yt:format='5'/> 

<!-- What i actually want is this one --> 
<media:content 
    url='rtsp://rtsp2.youtube.com/ChoLENy73bIAEQ1kgGDA==/0/0/0/video.3gp' 
    type='video/3gpp' medium='video' 
    expression='full' duration='215' yt:format='1'/> 

<media:content 
    url='rtsp://rtsp2.youtube.com/ChoLENy73bIDRQ1kgGDA==/0/0/0/video.3gp' 
    type='video/3gpp' medium='video' 
    expression='full' duration='215' yt:format='6'/> 

두 번째 노드에는 'video/3gpp'유형이 있기 때문에 두 번째 노드를 원합니다. 어떻게 그걸 선택하려고합니까? 속성 (type == "video/3gpp")이이 값을 얻으면 논리가

이됩니다.

하지만 Linq에서 이것을 표현하는 방법을 모르겠습니다.

감사합니다.

대니.

답변

0

아마도 다음과 같습니다.

where xElem.Element(atomNS + "content").Attribute("type").Value == "video/3gpp" 

편집 : OP를 Linq에 대한 지식이 없다고 가정하지 않고 확장하고 설명하는 방법을 알지 못했습니다. 원래 쿼리를 만들고 싶습니다.

from xElem in xml.Descendants(atomNS + "entry") 
where xElem.Element(atomNS + "content").Attribute("type").Value == "video/3gpp" 
select new YouTubeVideo() { 
    ... 
} 

문서의 요소를 볼 수있는 것처럼 노드의 속성을 조사 할 수 있습니다. 그 속성을 가진 여러 요소가있는 경우, 당신은 (당신이 항상 먼저 찾을 원하는 가정) 할 수 ... 난 당신이 조회하고있는 노드가 요소 (믿는대로

(from xElem in xml.Descendants(atomNS + "entry") 
    where xElem.Element(atomNS + "content").Attribute("type").Value == "video/3gpp" 
    select new YouTubeVideo() { 
     ... 
    }).First(); 

나는 원래 게시물을 변경 atomNS + "컨텐츠")가 아닌 최고 수준의 xElem 관련 가져 오기 방법이 Xml Library (내가 그것을 사용하는 방법을 알고해서)에서 XPath를 사용

+0

확장하고 설명 하시겠습니까? – DanTonyBrown

+0

죄송합니다. 우선 확장 방법을 잘 모르겠습니다.하지만 원래 도움이되지 않았기 때문에 도움을 요청 받았습니다. – Hammerstein

+0

where 원인을 추가하면 var에 아무 것도 반환되지 않는다는 것을 의미합니다./ – user1413671

0

: 비디오 유형 않은 경우

string videoType = "video/3gpp"; 

XElement root = XElement.Load(file); // or .Parse(xmlstring) 
var videos = root.XPath("//entry") 
    .Select(xElem => new YouTubeVideo() 
    { 
     Title = xElem.Get("title", "title"), 
     Description = xElem.Get("content", "content"), 
     DateUploaded = xElem.Get("published", "published"), 
     ThumbnailLocation = xElem.XGetElement("group/content[@type={0}]/url", "url", videoType), 
     ViewerLocation = xElem.XGetElement("group/content[@type={0}]/url", "url", videoType) 
    }); 

변경하면 XGetElement를 다음과 같이 바꿀 수 있습니다 :

xElem.XGetElement("group/content[@type='video/3gpp']/url", "url") 

라이브러리를 사용하는 네임 스페이스를 지정하지 않아도됩니다. 조사 할 수있는 Microsoft의 XPathSelectElements()XPathSelectElement()이 있지만 이름 공간을 지정하고 nice Get 메서드가 필요하지 않습니다. 주의해야 할 점은 라이브러리가 완전한 XPath 구현은 아니지만 위의 경우와 동일하다는 것입니다.

관련 문제