SimpleXML, org.simpleframework.xml.core.PersistenceException

После долгих разочарований я пришел сюда за помощью. Я использую org.simpleframework.xml для анализа RSS-каналов в Android. Я получаю следующую ошибку, когда пытаюсь проанализировать файл xml:

org.simpleframework.xml.core.PersistenceException: Element 'link' is already used with @org.simpleframework.xml.Element(data=false, name=, required=true, type=void) on field 'link'

Это образец xml, который я пытаюсь разобрать:

<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xml:base="http://www.somelink.com/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>My Title</title>
        <description>Latest breaking news, sport, weather and opinion, from South Africa, Africa and the world.</description>
        <link>http://www.somelink.com/</link>
        <atom:link rel="self" href="http://www.someotherlink.com" />
    </channel>
</rss>

Это классы и аннотации, которые я использую в коде:

@Root(name = "rss")
@Namespace(reference = "http://www.w3.org/2005/Atom", prefix = "atom")
public class NewsFeed
{
    @Version(revision = 2.0)
    private float version;

    @Attribute
    private String base;

    @Element
    private Channel channel;
}

@Root(name = "channel")
public class Channel
{
    @Element
    private String title;

    @Element
    private String description;

    @Element
    private String link;

    @Element
    @Namespace(reference = "http://www.w3.org/2005/Atom", prefix = "atom")
    private Link rssLink;

    @ElementList(inline = true)
    private List<NewsItem> newsItems;
}

@Root(name = "link")
public class Link
{
    @Attribute
    private String rel;

    @Attribute
    private String href;

    public String getRel()
    {
        return rel;
    }

    public void setRel(String rel)
    {
        this.rel = rel;
    }

    public String getHref()
    {
        return href;
    }

    public void setHref(String href)
    {
        this.href = href;
    }
}

Я создал класс Link, чтобы использовать пространство имен атома. Как вы можете видеть из ошибки, библиотека, похоже, не принимает во внимание пространство имен, и поэтому она жалуется, что элемент ссылки уже используется. Что я делаю не так? Ваша помощь будет принята с благодарностью.


person Wouter    schedule 25.07.2014    source источник


Ответы (1)


Я столкнулся с той же проблемой. Кажется, link и atom:link рассматриваются как одна и та же запись даже в разных пространствах имен, и их нужно объединить в один список List<Link> rssLink .

Вот мой код модели kotlin для разбора rss-канала, он отлично работает:

@Root(name = "rss", strict = false)
data class RssFeed(
    @field:Element(name = "channel")
    var channel: RssChannel = RssChannel()
)

@NamespaceList(
    Namespace(prefix = "atom", reference = "http://www.w3.org/2005/Atom")
)
@Root(name = "channel", strict = false)
data class RssChannel(
    @field:Element var title: String = "",
    @field:Element var description: String = "",
    @field:Element var generator: String = "",
    @field:Element var lastBuildDate: String = "",

    @field:ElementList(entry = "link", required = false, inline = true)
    var links: List<RssLink> = ArrayList(),

    @field:ElementList(inline = true)
    var items: List<RssItem> = ArrayList()
)

@Root(name = "item", strict = false)
data class RssItem(
    @field:Element
    var title: String = "",

    @field:Element
    var pubDate: String = "",

    @field:Element
    var link: String = "",

    @field:Element(required = false)
    var description: String = "",

    @field:Element
    var guid: String = ""
)

@Root(name = "link", strict = false)
data class RssLink(
    // for <link>http://www.somelink.com/</link>
    @field:Text(required = false) var text: String = "",

    // for <atom:link rel="self" href="http://www.someotherlink.com" />
    @field:Attribute(required = false) var rel: String = "",
    @field:Attribute(required = false, name = "type") var contentType: String = "",
    @field:Attribute(required = false) var href: String = ""
)

Вы также можете проверить здесь

person tianyu    schedule 02.09.2020