2014-07-25 4 views
0

저는 C#과 Windows App 개발에 익숙하지 않았습니다. 내 경험은 대부분 파이썬이지만, 새로운 것을 배우기 위해 스스로 도전하고 있습니다. 나는 8.1에 대한 지시 사항을 수정을 포함하여 튜토리얼 (완료 http://msdn.microsoft.com/en-us/library/windows/apps/br211380.aspxC# Win8.1 App에서 XML ElementExtensions를 읽는 중

: 나는 윈도우 스토어 앱을 만들어 C#을 학습/연습, 일부 WinJS을하고 이후 봤는데

은/HTML5 튜토리얼 나는이 튜토리얼에서 시작 애플 리케이션을 배후에있다. 이제 다른 유형의 데이터를 처리하기 위해 응용 프로그램을 조정하려고합니다.

게시물의 각 항목에서 모든 이미지 : 이미지 태그를 가져 오려고합니다. 이것을 표시합니다. 이것은 RSS 피드의 XML 데이터 구조입니다.

 <item> 
     <title>Post with photos</title> 
     <link>http://website.com/2014/07/23/post-1//</link> 
     <comments>http://website.com/2014/07/23/post-1/#comments</comments> 
     <pubDate>Wed, 23 Jul 2014 15:45:02 +0000</pubDate> 
     <dc:creator><![CDATA[Author]]></dc:creator> 
       <category><![CDATA[Post]]></category> 

     <guid isPermaLink="false">http://www.website.com/p?1</guid> 
     <description><![CDATA[description here]]></description> 
     <wfw:commentRss>http://www.website.com/post/1/feed/</wfw:commentRss> 
     <slash:comments>0</slash:comments> 
     <enclosure type="image/jpeg" length="1" url="http://0.gravatar.com/avatar/" /> 

     <media:thumbnail url="http://www.website.com/thumbnail_urle1406130272443.jpg?w=500" /> 
      <media:content url="http://0.gravatar.com/avatar/" medium="image"> 
      <media:category>author</media:category> 
     </media:content> 
      <media:content url="http://www.website.com/post/1/233-e1406130272443.jpg" medium="image"> 
      <media:title>image-23</media:title> 
        </media:content> 
      <media:content url="http://www.website.com/post/1/163.jpg" medium="image"> 
      <media:title>image-16</media:title> 
        </media:content> 
      <media:content url="http://www.website.com/post/1/73.jpg" medium="image"> 
      <media:title>bimage-7</media:title> 
        </media:content> 
     </item> 
,

나는 HTML5/JS에서 이것을 구현 내가 한 때이 방법을 사용 :

 var thumb = post.querySelector(
      "thumbnail").attributes.getNamedItem("url").textContent; 
     var postImages = post.querySelectorAll("content"); 

     var ImageList = []; 
     for (var imgIndex = 1; imgIndex < postImages.length; imgIndex++) { 
      var imgHTML = "<img src='" + postImages[imgIndex].attributes.getNamedItem("url").textContent + "'</img><br/>"; 
      var ImageList = ImageList += imgHTML; 
     } 

그러나 자연을 .. C#으로하지 않습니다. 그래서이 스레드를 보았습니다 : Get media elements from RSS using SyndicationFeed뿐만 아니라 그 안에 연결된 하나 그들은 나를 위해 작동하지 않습니다. var 요소 = rss.Feed.Items.SelectMany (s => s.ElementExtensions.Select (x => x.GetObject(). Value));를 사용하려고합니다.

코드를 사용하여 모두 넣으면 GetObject 메서드를 사용할 수 없습니다. 여기 내 현재 데이터 모델입니다.

 private async Task<FeedData> GetFeedAsync(string feedUriString) 
     { 
      Windows.Web.Syndication.SyndicationClient client = new SyndicationClient(); 
      Uri feedUri = new Uri(feedUriString); 

      try 
      { 
       SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri); 

       // This code is executed after RetrieveFeedAsync returns the SyndicationFeed. 
       // Process the feed and copy the data you want into the FeedData and FeedItem classes. 
       FeedData feedData = new FeedData(); 

       if (feed.Title != null && feed.Title.Text != null) 
       { 
        feedData.Title = feed.Title.Text; 
       } 
       if (feed.Subtitle != null && feed.Subtitle.Text != null) 
       { 
        feedData.Description = feed.Subtitle.Text; 
       } 
       if (feed.Items != null && feed.Items.Count > 0) 
       { 
        // Use the date of the latest post as the last updated date. 
        feedData.PubDate = feed.Items[0].PublishedDate.DateTime; 

        foreach (SyndicationItem item in feed.Items) 
        { 
         FeedItem feedItem = new FeedItem(); 
         if (item.Title != null && item.Title.Text != null) 
         { 
          feedItem.Title = item.Title.Text; 
         } 
         if (item.PublishedDate != null) 
         { 
          feedItem.PubDate = item.PublishedDate.DateTime; 
         } 
         if (item.Authors != null && item.Authors.Count > 0) 
         { 
          feedItem.Author = item.Authors[0].Name.ToString(); 
         } 
         // Handles RSS/Atom Feed differences.. 
         if (feed.SourceFormat == SyndicationFormat.Atom10) 
         { 
          if (item.Content != null && item.Content.Text != null) 
          { 
           feedItem.Content = item.Content.Text; 
          } 
          if (item.Id != null) 
          { 
           feedItem.Link = new Uri(item.Id); 
          } 
         } 
         else if (feed.SourceFormat == SyndicationFormat.Rss20) 
         { 
          if (item.Summary != null && item.Summary.Text != null) 
          { 
           feedItem.Content = item.Summary.Text; 
          } 
          if (item.Links != null && item.Links.Count > 0) 
          { 
           feedItem.Link = item.Links[0].Uri; 
          } 
         } 
         feedData.Items.Add(feedItem); 
        } 
       } 
       return feedData; 
      } 
      catch (Exception) 
      { 
       return null; 
      } 
     } 

내가 중단 점을 설정하고 내 RSS2.0 신디케이션 처리기에서 항목 데이터를 찾고 시도했습니다, 나는 VAR 미디어 =의 item.ElementExtensions을 볼 수 있습니다; 내 게시물의 모든 요소 확장자와 제목을 정확하게 표시합니다. (NodeName "content", NodeValue는 요소의 "title"이지만 url 태그의 URI는 없습니다.)

이 미디어를 가져 오는 방법을 통합하는 방법을 찾고 있는데, 콘텐츠, 미디어 축소판, 등, 목록에 그래서 내가 그들을 조립하고 내 애플 리케이션에서 HTML 콘텐츠에 대한 그들을 사용할 수 있습니다.

조언을 보내 주시면 감사하겠습니다.

편집 :

내 코드의 더 ..

public class FeedData 
    { 
     public string Title { get; set; } 
     public string Description { get; set; } 
     public DateTime PubDate { get; set; } 
     public Uri Image { get; set; } 

     private List<FeedItem> _Items = new List<FeedItem>(); 
     public List<FeedItem> Items 
     { 
      get 
      { 
       return this._Items; 
      } 
     } 

    } 

    // Holds info for a single blog post 
    public class FeedItem 
    { 
     public string Title { get; set; } 
     public string Author { get; set; } 
     public string Content { get; set; } 
     public DateTime PubDate { get; set; } 
     public Uri Link { get; set; } 
    } 

    // Holds a collection of blog feeds (FeedData), and contains methods needed to retrieve 
    // the feeds 
    public class FeedDataSource 
    { 
     private ObservableCollection<FeedData> _Feeds = new ObservableCollection<FeedData>(); 
     public ObservableCollection<FeedData> Feeds 
     { 
      get 
      { 
       return this._Feeds; 
      } 
     } 

     public async Task GetFeedsAsync() 
     { 
      Task<FeedData> feed1 = 
       GetFeedAsync("http://url.com/feed"); 
      Task<FeedData> feed2 = 
       GetFeedAsync("http://url.com/feed"); 
      ... 
      ... 

      this.Feeds.Add(await feed1); 
       ... 
       ... 
       ... 
      this.Feeds.Add(await feed15); 

     } 
+0

나는 내 자신의 문제를 해결했습니다. XMLDocument를로드 할 필요가 있음을 알았다면 태그를 사용하여 요소를 선택하고 속성을 가져올 수있었습니다. 꽤 직설적 인! 답변은 다음과 같습니다. – MorePyPlease

답변

0

SyndicationItem에는 SourceFormat (예 : Rss20)을 사용하고 GEtElementsByTagName (또는 ID)을 사용하여 구문 분석 할 수있는 XML 문자열이 생성되는 GetXMLDocument 메서드가 있습니다. 일단 루프에서 중복 태그를 반복하고 Attributes.GetNamedItem()을 사용하여 XML 태그의 명명 된 속성을 가져올 수 있습니다. Rss20 형식의 media : content 태그에 대해 xml을 탐색 할 때 'media'가 생략 된 것처럼 보이므로 모든 필요한 내용을 검색 할 수 있습니다.

var allImages = item.GetXmlDocument(feed.SourceFormat).GetElementsByTagName("content"); 
foreach (var s in allImages) 
{ 
Debug.WriteLine(s.Attributes.GetNamedItem("url").InnerText;) 
} 
2

내가 전화 응용 프로그램에 익숙하지 않아요하지만 당신은 어떤 종류의 리피터, 데이터 그리드 등으로이 데이터를 넣어 될 것 ., 예? Task 일반 객체에 익숙하지 않아서 C# 키 - 값 쌍 클래스를 List와 함께 사용하고 Repeater, Grid에서이 객체를 직접 사용할 수 있습니다. 나는 IEnumerable (List가 있어야 함)을 구현하는 객체가 KeyValuePair로 반복 될 수 있다고 믿는다.

내가 원하는 것을 조금 더 알려줘. 그것은

foreach KeyValuePair KVP in ListObject 
{ 
    //Access KVP.key and values with your code here ... 
} 

더 명확한 예는 사전 개체를 반복하는 KVP를 사용하는 나에게 보인다

foreach (KeyValuePair<string, string> entry in dictTestEasement) 
    { 
     builder.RowFormat.Height = 0.2; //force row height by text font by setting height small 
     builder.InsertCell(); 
     builder.Font.Bold = true; 
     builder.InsertHtml(entry.Key); 
     builder.Font.Bold = false; 
     builder.InsertCell(); 
     builder.InsertHtml(entry.Value); 
    } 

이 경우 빌더는 문서 건설을위한 전역 객체 (Aspose 단어가 객체이다) - 그것은 Word 문서를 만들고 있습니다. 그것을 버리지 마십시오.

은 간단합니다. 이전에 그런 솔루션을 사용해 왔지만 그게 당신이 낚시하는 것이라고 믿습니다.

+0

안녕하세요 .. 답장을 보내 주셔서 감사합니다. 내 RSS2.0의 경우 FeedItem 루프 (feed.Items의 foreach (SyndicationItem 항목)) 내부에 설정하여 구현 한 것을 시도했습니다. 불행히도 Web.Syndication.SyndicationItem getEnumerator에 대한 공용 정의가 포함되어 있지 않기 때문에 'Web.Syndication.SyndicationItem 형식의 변수에서 작동하지 않을 수 foreach 문을 가져 와서'고마워! - 나머지 코드 모델을 볼 수 있도록 위 코드를 업데이트했습니다. – MorePyPlease

관련 문제