JAXB マーシャラーを使用して、Java クラスを XML MRSS ファイルに変換します。次のようになります。
public class RssBuilder {
public void saveToFile( RSS rss, String fileName ) {
JAXBContext jaxbContext = JAXBContext.newInstance( RSS.class );
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );
NamespacePrefixMapper mapper = namespaceMapper;
marshaller.setProperty( "com.sun.xml.bind.namespacePrefixMapper", mapper );
marshaller.setProperty( Marshaller.JAXB_FRAGMENT, true );
fos = new FileOutputStream( fileName );
marshaller.marshal( rss, fos );
}
}
@XmlRootElement
public class RSS {
@XmlElement( name = "channel" )
public List<RssChannel> getChannels() {return channels;}
}
public class RssChannel {
@XmlElement( name = "item" )
private List<RssItem> items;
public void setItems( List<RssItem> items ) { this.items = items; }
public void addItem( RssItem item ) { this.items.add( item ); }
....
}
public class RssItem {
@XmlElement (name = "description", namespace=RSS.YAHOO_XMLNS)
private MediaTitle mediaDescription;
@XmlElement (name ="origReleaseDate", namespace=RSS.BING_XMLNS)
private String origReleaseDate;
....
}
YAHOO と BING の 2 つの MRSS 形式があります。BING MRSS はほとんど同じで、YAHOO スキームにいくつかの要素を追加するだけなので、要素の注釈で 2 つの名前空間を使用します。このように YAHOO MRSS ファイルにも 'bing' 要素がないのに BING スキーマの xmnls 属性が含まれているという問題があります。別の RSS ルート要素クラスを作成することで解決できますが、チャネル要素とアイテム要素に対しても別のクラスを作成することになります。
これを解決する簡単な方法はありますか?