2013-08-09 3 views
2

일부 RSS 피드를 구문 분석하기 위해 로마를 사용하려고합니다. RSS 피드 중 하나는 이 버전으로 0.91을 지정하고 사용자 정의 XML 네임 스페이스가 정의되어 있지 않지만 항목에 여전히 사용자 정의 요소가 있음을 나타냅니다. 로마를 사용하여 정의 된 네임 스페이스없이 이러한 사용자 정의 태그를 구문 분석 할 수 있습니까?로마 API를 사용하여 사용자 지정 rss 태그 구문 분석

감사합니다.

+2

혹시이 문제를 해결할 수 있었습니까? – GarySharpe

답변

3

예. 당신은 그것을 수행하기 위해 커스텀 파서를 작성해야한다.

customStringcustomDate 요소를 처리한다고 가정 해 보겠습니다. 먼저 사용자 정의 요소를 저장하도록 Item 클래스를 확장합니다.

package com.example; 

import com.sun.syndication.feed.rss.Item; 
import java.util.Date; 

public class CustomItem extends Item { 

    private String _customString; 
    private Date _customDate; 

    public String getCustomString() { 
     return _customString; 
    } 

    public void setCustomString(String customString) { 
     _customString = customString; 
    } 

    public Date getCustomDate() { 
     return _customDate; 
    } 

    public void setCustomDate(Date customDate) { 
     _customDate = customDate; 
    } 

} 

다음으로 파서를 작성하십시오. 또한 파싱 할 표준 요소를 처리해야합니다.

package com.example; 

import com.example.CustomItem;  
import com.sun.syndication.feed.rss.Item; 
import com.sun.syndication.io.WireFeedParser; 
import com.sun.syndication.io.impl.DateParser; 
import com.sun.syndication.io.impl.RSS091UserlandParser; 
import org.jdom.Element; 

public class CustomParser extends RSS091UserlandParser implements WireFeedParser { 

    public CustomItem parseItem(Element rssRoot, Element eItem) { 
     CustomItem customItem = new CustomItem(); 

     // Standard elements 
     Item standardItem = super.parseItem(rssRoot, eItem); 
     customItem.setTitle(standardItem.getTitle()); 
     customItem.setDescription(standardItem.getDescription()); 

     // Non-standard elements 
     Element e = eItem.getChild("customString", getRSSNamespace()); 
     if (e != null) { 
      customItem.setCustomString(e.getText()); 
     } 

     e = eItem.getChild("customDate", getRSSNamespace()); 
     if (e != null) { 
      customItem.setCustomDate(DateParser.parseDate(e.getText())); 
     } 

     return customItem; 
    } 

} 

마지막으로 당신은 당신이 처리 할 피드의 다른 유형에 대한 파서와 함께 rome.properties 파일에 파서를 정의 할 필요가있다.

# Feed Parser implementation classes 
# 
WireFeedParser.classes=com.example.CustomParser 
+1

그리고이 파서를 사용하여 데이터를 얻는 방법은 무엇입니까? – Shams

+0

아마도 다음과 같이 될까요? 'WireFeedInput input = 새로운 WireFeedInput(); 채널 채널 = (채널) input.build (새 XmlReader (feedUrl)); 'http://rometools.github.io/rome/HowRomeWorks/도 참조하십시오 –

+0

이 솔루션은 어느 솔루션에서나 작동합니까? –

0

데이터를 가져 오려면 사용자 지정 변환기를 작성해야합니다.

위 코드와 동일합니다.

먼저 사용자 정의 요소를 저장하도록 Item 클래스를 확장하십시오.

package com.example; 

import com.sun.syndication.feed.rss.Item; 
import java.util.Date; 

public class CustomItem extends Item { 

    private String _customString; 
    private Date _customDate; 

    public String getCustomString() { 
     return _customString; 
    } 

    public void setCustomString(String customString) { 
     _customString = customString; 
    } 

    public Date getCustomDate() { 
     return _customDate; 
    } 

    public void setCustomDate(Date customDate) { 
     _customDate = customDate; 
    } 

} 

다음으로 파서를 작성하십시오. 또한 파싱 할 표준 요소를 처리해야합니다.

package com.example; 

import com.example.CustomItem;  
import com.sun.syndication.feed.rss.Item; 
import com.sun.syndication.io.WireFeedParser; 
import com.sun.syndication.io.impl.DateParser; 
import com.sun.syndication.io.impl.RSS091UserlandParser; 
import org.jdom.Element; 

public class CustomParser extends RSS091UserlandParser implements WireFeedParser { 

    public CustomItem parseItem(Element rssRoot, Element eItem) { 
     CustomItem customItem = new CustomItem(); 

     // Standard elements 
     Item standardItem = super.parseItem(rssRoot, eItem); 
     customItem.setTitle(standardItem.getTitle()); 
     customItem.setDescription(standardItem.getDescription()); 

     // Non-standard elements 
     Element e = eItem.getChild("customString", getRSSNamespace()); 
     if (e != null) { 
      customItem.setCustomString(e.getText()); 
     } 

     e = eItem.getChild("customDate", getRSSNamespace()); 
     if (e != null) { 
      customItem.setCustomDate(DateParser.parseDate(e.getText())); 
     } 

     return customItem; 
    } 

} 

변환기를 작성하십시오. rome.properties 당신이 처리 할 피드의 다른 유형에 대한 파서와 함께 파일에

public class CustomConverter extends ConverterForRSS20 { 

     protected SyndEntry createSyndEntry(Item item) { 
      List<HashMap<String,String>> temp = new ArrayList<HashMap<String,String>>(); 
      SyndEntry syndEntry = super.createSyndEntry(item); 
      customItem customItem = (customItem)item;   

      List<String> customList = new ArrayList<String>(); 
      customList.add(customItem.getCustomString()); 
      //set to empty attribute ex foreignmarkup 
      syndEntry.setForeignMarkup(customList); 

      return syndEntry; 
     } 
} 

마지막으로 당신은 당신의 파서를 정의 할 필요가있다.

# Feed Parser implementation classes 
# 
WireFeedParser.classes=com.example.CustomParser 
# Feed Converter implementation classes 
# 
Converter.classes=com.example.CustomConverter 

그러면 가치를 얻을 수 있습니다.

SyndFeed feed = input.build(new XmlReader(feedUrl)); 
List<SyndEntryImpl> entrys = feed.getEntries(); 
    for(SyndEntryImpl entry:entrys){ 
     System.out.println(entry.getForeignMarkup()); 
    }