일부 RSS 피드를 구문 분석하기 위해 로마를 사용하려고합니다. RSS 피드 중 하나는 이 버전으로 0.91을 지정하고 사용자 정의 XML 네임 스페이스가 정의되어 있지 않지만 항목에 여전히 사용자 정의 요소가 있음을 나타냅니다. 로마를 사용하여 정의 된 네임 스페이스없이 이러한 사용자 정의 태그를 구문 분석 할 수 있습니까?로마 API를 사용하여 사용자 지정 rss 태그 구문 분석
감사합니다.
일부 RSS 피드를 구문 분석하기 위해 로마를 사용하려고합니다. RSS 피드 중 하나는 이 버전으로 0.91을 지정하고 사용자 정의 XML 네임 스페이스가 정의되어 있지 않지만 항목에 여전히 사용자 정의 요소가 있음을 나타냅니다. 로마를 사용하여 정의 된 네임 스페이스없이 이러한 사용자 정의 태그를 구문 분석 할 수 있습니까?로마 API를 사용하여 사용자 지정 rss 태그 구문 분석
감사합니다.
예. 당신은 그것을 수행하기 위해 커스텀 파서를 작성해야한다.
customString
및 customDate
요소를 처리한다고 가정 해 보겠습니다. 먼저 사용자 정의 요소를 저장하도록 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
그리고이 파서를 사용하여 데이터를 얻는 방법은 무엇입니까? – Shams
아마도 다음과 같이 될까요? 'WireFeedInput input = 새로운 WireFeedInput(); 채널 채널 = (채널) input.build (새 XmlReader (feedUrl)); 'http://rometools.github.io/rome/HowRomeWorks/도 참조하십시오 –
이 솔루션은 어느 솔루션에서나 작동합니까? –
데이터를 가져 오려면 사용자 지정 변환기를 작성해야합니다.
위 코드와 동일합니다.
먼저 사용자 정의 요소를 저장하도록 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());
}
혹시이 문제를 해결할 수 있었습니까? – GarySharpe