我使用 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 有两种 MRSS 格式。BING MRSS 几乎相似,只是在 YAHOO 方案中添加了一些额外的元素,所以我在元素注释中使用了两个命名空间。以这种方式雅虎 MRSS 文件也包含 BING 模式的 xmnls 属性的问题,尽管没有“bing”元素。我可以创建单独的 RSS 根元素类来解决它,但它也会导致为频道和项目元素创建单独的类。
有没有更简单的方法来解决这个问题?