我正在使用 SimpleXML 库。我需要获取 rss 提要并将其转换为 java 对象。这里是我需要映射到对象的 XML
<rss xmlns:lj="http://www.livejournal.org/rss/lj/1.0/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom10="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<title>Всегда! Везде! Со всеми! и ни с кем!</title>
<link>http://xuma.livejournal.com/</link>
<description>
Всегда! Везде! Со всеми! и ни с кем! - LiveJournal.com
</description>
<lastBuildDate>Thu, 17 Mar 2011 10:08:33 GMT</lastBuildDate>
<generator>LiveJournal / LiveJournal.com</generator>
<lj:journal>xuma</lj:journal>
<lj:journalid>5295048</lj:journalid>
<lj:journaltype>personal</lj:journaltype>
<copyright>NOINDEX</copyright>
<image>
<url>http://l-userpic.livejournal.com/104864030/5295048</url>
<title>Всегда! Везде! Со всеми! и ни с кем!</title>
<link>http://xuma.livejournal.com/</link>
<width>66</width>
<height>100</height>
</image>
<item>
<guid isPermaLink="true">http://xuma.livejournal.com/7831.html</guid>
<pubDate>Thu, 17 Mar 2011 10:08:33 GMT</pubDate>
<title>Япония. Поможем пострадавшим.</title>
<link>http://xuma.livejournal.com/7831.html</link>
<description>...</description>
<comments>http://xuma.livejournal.com/7831.html</comments>
<lj:security>public</lj:security>
<lj:reply-count>0</lj:reply-count>
</item>
<item>
<guid isPermaLink="true">http://xuma.livejournal.com/7575.html</guid>
<pubDate>Sat, 16 Oct 2010 12:36:48 GMT</pubDate>
<link>http://xuma.livejournal.com/7575.html</link>
<description>
<h1>Тест личности</h1><br /><a href="http://teh-nomad.livejournal.com/667478.html"><img border="0" src="http://www.ljplus.ru/img4/a/s/astro_nomad/chtree_6.jpg" alt="" /></a><br /><br /><a href="http://teh-nomad.livejournal.com/667478.html">Выбрать себе дерево</a>
</description>
<comments>http://xuma.livejournal.com/7575.html</comments>
<lj:music>I chase the Devil</lj:music>
<media:title type="plain">I chase the Devil</media:title>
<lj:mood>опаздываю...</lj:mood>
<lj:security>public</lj:security>
<lj:reply-count>0</lj:reply-count>
</item>
</channel>
</rss>
这是我定义的bean:
@Root
public class RssType {
@Element(name="channel")
private ChannelType channel;
@Attribute
private String version;
public ChannelType getChannel() {
return channel;
}
public void setChannel(ChannelType channel) {
this.channel = channel;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
}
@Element(name="channel")
public class ChannelType {
@Element
private String title;
@Element
private String link;
@Element
private String description;
@Element
private String lastBuildDate;
@Element
private String generator;
@Element
@Namespace(reference="http://www.livejournal.org/rss/lj/1.0/", prefix="lj")
private String journal;
@Element
@Namespace(reference="http://www.livejournal.org/rss/lj/1.0/", prefix="lj")
private String journalid;
@Element
@Namespace(reference="http://www.livejournal.org/rss/lj/1.0/", prefix="lj")
private String journaltype;
@Element
private ImageType image;
@ElementList(inline=false)
private List<ItemType> item;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getLastBuildDate() {
return lastBuildDate;
}
public void setLastBuildDate(String lastBuildDate) {
this.lastBuildDate = lastBuildDate;
}
public String getGenerator() {
return generator;
}
public void setGenerator(String generator) {
this.generator = generator;
}
public String getJournal() {
return journal;
}
public void setJournal(String journal) {
this.journal = journal;
}
public String getJournalid() {
return journalid;
}
public void setJournalid(String journalid) {
this.journalid = journalid;
}
public String getJournaltype() {
return journaltype;
}
public void setJournaltype(String journaltype) {
this.journaltype = journaltype;
}
public ImageType getImage() {
return image;
}
public void setImage(ImageType image) {
this.image = image;
}
public List<ItemType> getItem() {
return item;
}
public void setItem(List<ItemType> item) {
this.item = item;
}
}
@Element(name="image")
public class ImageType {
@Element
private String url;
@Element
private String title;
@Element
private String link;
@Element
private String width;
@Element
private String height;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getWidth() {
return width;
}
public void setWidth(String width) {
this.width = width;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
}
@Element(name="item")
public class ItemType {
@Element
private GuidType guid;
@Element
private String pubDate;
@Element
private String title;
@Element
private String link;
@Element
private String description;
@Element
private String comments;
@ElementList(inline=false)
private List<String> category;
@Element
@Namespace(reference="http://www.livejournal.org/rss/lj/1.0/", prefix="lj")
private String security;
@Element
@Namespace(reference="http://www.livejournal.org/rss/lj/1.0/", prefix="lj")
private String replyCount;
public GuidType getGuid() {
return guid;
}
public void setGuid(GuidType guid) {
this.guid = guid;
}
public String getPubDate() {
return pubDate;
}
public void setPubDate(String pubDate) {
this.pubDate = pubDate;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getComments() {
return comments;
}
public void setComments(String comments) {
this.comments = comments;
}
public List<String> getCategory() {
return category;
}
public void setCategory(List<String> category) {
this.category = category;
}
public String getSecurity() {
return security;
}
public void setSecurity(String security) {
this.security = security;
}
public String getReplyCount() {
return replyCount;
}
public void setReplyCount(String replyCount) {
this.replyCount = replyCount;
}
}
@Element(name="guid")
public class GuidType {
@Attribute
public String isPermaLink;
public String text;
@Text
public String getText() {
return text;
}
@Text
public void setText(String text) {
this.text = text;
}
public String getIsPermaLink() {
return isPermaLink;
}
public void setIsPermaLink(String isPermaLink) {
this.isPermaLink = isPermaLink;
}
}
执行此代码:
String xmlData = retrieve("http://zuma.livejournal.com/data/rss");
Serializer serializer = new Persister();
RssType example = serializer.read(RssType.class, xmlData);
得到这样的异常
org.simpleframework.xml.core.AttributeException: Attribute 'isPermaLink' does not have a match in class com.ljclient.xml.beans.ItemType at line 22
但是isPermaLink
不是节点的属性<item>
而是<guid>
节点。
如果我isPermaLink
成为一个属性,<item>
在这种情况下,我会遇到以下异常:
org.simpleframework.xml.core.ValueRequiredException: Unable to satisfy @org.simpleframework.xml.ElementList(data=false, empty=true, entry=, inline=false, name=, required=true, type=void) on field 'category' private java.util.List com.ljclient.xml.beans.ItemType.category for class com.ljclient.xml.beans.ItemType at line 22
这很奇怪,因为每个类别节点都存在该值。有任何想法吗?