2010-02-16 7 views
1

RSS 피드에서 노드를 선택하려고합니다. 그것은 트위터에 대한 잘 작동하지만, 나는 유튜브에서 그것을 할 수 없습니다.이 XPath 쿼리의 문제점은 무엇입니까?

 string youtube = "http://gdata.youtube.com/feeds/api/users/CTVOlympics/uploads"; 
     string twitter = "http://twitter.com/statuses/user_timeline/ctvolympics.rss"; 

     //this populates the XmlNodeList object 
     XmlTextReader readerTwitter = new XmlTextReader(twitter); 
     XmlDocument docTwitter = new XmlDocument(); 
     docTwitter.Load(readerTwitter); 
     XmlNodeList nodesTwitter = docTwitter.SelectNodes("/rss/channel/item"); 

     //this doesn't populate the object 
     XmlTextReader readerYoutube = new XmlTextReader(youtube); 
     XmlDocument docYoutube = new XmlDocument(); 
     docYoutube.Load(readerYoutube); 
     XmlNodeList nodesYoutube = docYoutube.SelectNodes("/feed/entry"); 

어떤 아이디어가 있습니까?

+0

이 .NET 1.1 : –

+0

존 손더스에게 감사합니다. 매우 도움이되었습니다. xml 피드는 위와 링크되어 있으므로 질문을 읽지 않았을 수 있습니다. 단순히 자신의 텍스트를 읽는 것보다 도움을 청하려는 사람은 도움이되는 의견을 남겼을 것입니다. –

+0

@ codemonkey12 : 그게 전부였습니다. 그리고 그 의견은 유효합니다. –

답변

3

네임 스페이스 'http://www.w3.org/2005/Atom'에서 노드 '항목'을 선택해야하는 반면 빈 네임 스페이스에서 '항목'노드를 선택하려고합니다.

XmlNamespaceManager nsmanager = new XmlNamespaceManager(docYoutube.NameTable); 
nsmanager.AddNamespace(String.Empty, "http://www.w3.org/2005/Atom"); 

또는 당신이, 당신이 XpathVisualizer을 사용할 수 있습니다 XPath 쿼리의 결과를 시각화하고 싶은 경우에 당신은 "/*[local-name()='feed']/*[local-name()='entry']"

1

네임 스페이스를 지정하십시오.

+0

XmlNode .. ::. SelectNodes 메서드 (String, XmlNamespaceManager)를 참조하십시오. http://msdn.microsoft.com/en-us/library/4bektfx9.aspx –

0

xml-document에 <feed> -element가 없거나 <entry> 요소에 <feed> -parent가 없기 때문에 오류가 발생하지 않아야합니다.

+0

도움이 될만한 사람이 실제로 보일 것이라고 기대했습니다. 내가 이렇게 바보 같은 "대답"을 남긴 XML은 주어지지 않을 것이다. –

+0

@ codemonkey12 : 정답입니다. 그것은 (네임 스페이스 한정)'feed' 엘리먼트를 가지고 있지 않습니다. –

0

/대신 /를 사용하여 문제의 원인을 찾아보십시오. 그래서 // entry와 같은 것은 내 작업을 더 잘 이해하기 때문에 요청을 찾는 깊이를가집니다.

하지만 내 질문은 XPath 쿼리가 실제로 아무것도 검색하는지 여부입니다.

1

을 사용할 수

당신은 기본 네임 스페이스를 지정하는 XMLNamespaceManager를 사용할 수 있습니다. 이것은 WinForms 도구입니다. 쿼리 할 XML 문서를로드하고 쿼리를 입력 한 다음 결과를 봅니다.

alt text http://i45.tinypic.com/2jb409.jpg

무료. 오픈 소스. "/*[local-name()='feed']/*[local-name()='entry']"

+0

위대한 도구 참조에 대한 +1 감사 –

+0

굉장한 도구, 감사합니다 !!! –

0
string youtube = "http://gdata.youtube.com/feeds/api/users/CTVOlympics/uploads"; 
string twitter = "http://twitter.com/statuses/user_timeline/ctvolympics.rss"; 

//this populates the XmlNodeList object 
XmlDocument docTwitter; 
using (var readerTwitter = XmlReader.Create(twitter)) 
{ 
    docTwitter = new XmlDocument(); 
    docTwitter.Load(readerTwitter); 
} 
XmlNodeList nodesTwitter = docTwitter.SelectNodes("/rss/channel/item"); 

//this doesn't populate the object 
XmlDocument docYoutube; 
using (var readerYoutube = XmlReader.Create(youtube)) 
{ 
    docYoutube = new XmlDocument(); 
    docYoutube.Load(readerYoutube); 
} 
XmlNamespaceManager ns = new XmlNamespaceManager(docYoutube.NameTable); 
ns.AddNamespace("atom", "http://www.w3.org/2005/Atom"); 
XmlNodeList nodesYoutube = docYoutube.SelectNodes("/atom:feed/atom:entry", ns); 
0

이 사용 해보세요? 그렇지 않다면,`new XmlTextReader()`대신`XmlReader.Create()`를 사용해야합니다. 또한 읽으려는 XML의 일부를 게시하십시오.
관련 문제