6

我一直在尝试围绕 RSS 提要包装一组基于简单 XML(Java 序列化器)的类。样本饲料是

<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
    <title>Coding Horror</title>
    <link>http://www.codinghorror.com/blog/</link>
    <description>programming and human factors - Jeff Atwood</description>
    <language>en-us</language>

    <lastBuildDate>Wed, 04 May 2011 20:34:18 -0700</lastBuildDate>
    <pubDate>Wed, 04 May 2011 20:34:18 -0700</pubDate>
    <generator>http://www.typepad.com/</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>

    <image>
        <title>Coding Horror</title>
        <url>http://www.codinghorror.com/blog/images/coding-horror-official-logo-small.png</url>
        <width>100</width>
        <height>91</height>
        <description>Logo image used with permission of the author. (c) 1993 Steven C. McConnell. All Rights Reserved.</description>
        <link>http://www.codinghorror.com/blog/</link>
    </image>

    <xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />   
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/codinghorror" />        

</channel>
 </rss>

我在运行代码时遇到的错误是

org.simpleframework.xml.core.PersistenceException: Element 'link' declared twice at line 24

并且该错误很公平,因为特定元素名称在 xml 中出现了两次,但方式不同。

第一个链接元素在这里

<link>http://www.codinghorror.com/blog/</link>

它直接在 Channel 标签下。然后下一个链接标签再次在Channel下,格式如下

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/codinghorror" />

在 Channel.java 类中,我不能有两个具有相同名称链接的变量。我尝试将变量名称更改为 blogLink 并尝试在 Element 注释中给出名称,Eclipse 给了我这个错误

 Change was

@Element("name=link")


Result is

The attribute value is undefined for the annotation Element

我知道我在这里遗漏了一些东西,但我无法确定它。我将不胜感激这方面的任何帮助。

更新

频道类

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

public atomlink getAtomLink() {
    return atomlink;
}

链接类

   import org.simpleframework.xml.Attribute;
   import org.simpleframework.xml.Namespace;
   import org.simpleframework.xml.Root;

  @Root(name="link")
  @Namespace(reference="http://www.w3.org/2005/Atom",prefix="atom10")
  public class atomlink {

@Attribute 
private String rel;

public String getRel() {
    return rel;
}

}

我已经更改了类名,但它仍然指向相同的错误。

4

6 回答 6

2

因为link元素出现了两次(虽然它们有不同的命名空间),所以你需要区分link一下,自爆是我的全部答案:</p>

1)<code>Rss bean

package com.example.xyzreader.data.bean;

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Namespace;
import org.simpleframework.xml.NamespaceList;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.Text;

import java.util.List;

/**
 * @author zmingchun
 * @version 1.0.0 (2017/3/20)
 */
@NamespaceList({
        @Namespace(prefix = "dc", reference = "http://purl.org/dc/elements/1.1/"),
        @Namespace(prefix = "atom", reference = "http://www.w3.org/2005/Atom"),
        @Namespace(prefix = "xhtml", reference = "http://www.w3.org/1999/xhtml"),
        @Namespace(prefix = "atom10", reference = "http://www.w3.org/2005/Atom"),
})
@Root(name = "rss" , strict = false)
public class Rss {
    @Element(name = "channel")
    public ChannelBean channel;
    @Attribute
    public String version;

    @Override
    public String toString() {
        return "Rss{" +
                "channel=" + channel +
                ", version='" + version + '\'' +
                '}';
    }

    @Root(name = "channel", strict = false)
    public static class ChannelBean {
        @Element
        public String title;
        @ElementList(entry = "link", inline = true, required = false)
        public List<Link> links;
        @Element
        public String description;
        @Element
        public String language;
        @Element
        public String lastBuildDate;
        @Element
        public String pubDate;
        @Element
        public String generator;
        @Element
        public String docs;
        @Element
        public ImageBean image;
        @Element
        public MetaBean meta;

        @Override
        public String toString() {
            return "ChannelBean{" +
                    "title='" + title + '\'' +
                    ", links=" + links +
                    ", description='" + description + '\'' +
                    ", language='" + language + '\'' +
                    ", lastBuildDate='" + lastBuildDate + '\'' +
                    ", pubDate='" + pubDate + '\'' +
                    ", generator='" + generator + '\'' +
                    ", docs='" + docs + '\'' +
                    ", image=" + image +
                    ", meta=" + meta +
                    '}';
        }

        /**
         * link bean
         */
        static class Link {
            @Attribute(required = false)
            public String href;

            @Attribute(required = false)
            public String rel;

            @Attribute(name = "type", required = false)
            public String contentType;

            @Text(required = false)
            public String link;

            @Override
            public String toString() {
                return "Link{" +
                        "href='" + href + '\'' +
                        ", rel='" + rel + '\'' +
                        ", contentType='" + contentType + '\'' +
                        ", link='" + link + '\'' +
                        '}';
            }
        }

        @Root(name = "image")
        public static class ImageBean {
            @Element
            public String title;
            @Element
            public String url;
            @Element
            public String width;
            @Element
            public String height;
            @Element
            public String description;
            @Element
            public String link;

            @Override
            public String toString() {
                return "ImageBean{" +
                        "title='" + title + '\'' +
                        ", url='" + url + '\'' +
                        ", width='" + width + '\'' +
                        ", height='" + height + '\'' +
                        ", description='" + description + '\'' +
                        ", link='" + link + '\'' +
                        '}';
            }
        }

        @Root(name = "meta")
        public static class MetaBean {
            @Attribute(required = false)
            public String name;

            @Attribute(required = false)
            public String content;

            @Override
            public String toString() {
                return "MetaBean{" +
                        "name='" + name + '\'' +
                        ", content='" + content + '\'' +
                        '}';
            }
        }
    }
}

2)TestSimpleXmlConvert方法

package com.example.xyzreader.manager;

import android.util.Log;

import com.example.xyzreader.data.bean.Rss;

import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.convert.AnnotationStrategy;
import org.simpleframework.xml.core.Persister;
import org.simpleframework.xml.strategy.Strategy;

/**
 * @author zmingchun
 * @version 1.0.0 (2017/3/20)
 */
public class TestSimpleXmlConvert {
    /**
     * test convert by simple-xml-2.7.1
     */
    public static void main(String[] args) {
        Strategy strategy = new AnnotationStrategy();
        Serializer serializer = new Persister(strategy);
        try {
            Rss tRss = serializer.read(Rss.class, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                    "<rss  xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:atom=\"http://www.w3.org/2005/Atom\" version=\"2.0\">\n" +
                    "<channel>\n" +
                    "    <title>Coding Horror</title>\n" +
                    "    <link>http://www.codinghorror.com/blog/</link>\n" +
                    "    <description>programming and human factors - Jeff Atwood</description>\n" +
                    "    <language>en-us</language>\n" +
                    "\n" +
                    "    <lastBuildDate>Wed, 04 May 2011 20:34:18 -0700</lastBuildDate>\n" +
                    "    <pubDate>Wed, 04 May 2011 20:34:18 -0700</pubDate>\n" +
                    "    <generator>http://www.typepad.com/</generator>\n" +
                    "    <docs>http://blogs.law.harvard.edu/tech/rss</docs>\n" +
                    "\n" +
                    "    <image>\n" +
                    "        <title>Coding Horror</title>\n" +
                    "        <url>http://www.codinghorror.com/blog/images/coding-horror-official-logo-small.png</url>\n" +
                    "        <width>100</width>\n" +
                    "        <height>91</height>\n" +
                    "        <description>Logo image used with permission of the author. (c) 1993 Steven C. McConnell. All Rights Reserved.</description>\n" +
                    "        <link>http://www.codinghorror.com/blog/</link>\n" +
                    "    </image>\n" +
                    "\n" +
                    "    <xhtml:meta xmlns:xhtml=\"http://www.w3.org/1999/xhtml\" name=\"robots\" content=\"noindex\" />   \n" +
                    "    <atom10:link xmlns:atom10=\"http://www.w3.org/2005/Atom\" rel=\"self\" type=\"application/rss+xml\" href=\"http://feeds.feedburner.com/codinghorror\" />        \n" +
                    "\n" +
                    "</channel>\n" +
                    " </rss>");
            Log.e(TestSimpleXmlConvert.class.getSimpleName(), "Convert result:"+ tRss.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
于 2017-03-20T01:40:49.283 回答
1

这是两个不同的元素。它们因命名空间而异。了解如何映射名称空间(如果该简单 XML 完全支持它们)。

呃,在文档中找到它:

http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#namesoace

@Element(name="link")
private Link link;

@Element(name="link")
@Namespace(reference="http://www.w3.org/2005/Atom")
private AtomLink atomLink;

等等。

于 2011-05-12T03:44:42.113 回答
0

我在解析带有内容的 xml 时遇到了同样的问题:

<gd:rating average='4.9304347' max='5' min='1' numRaters='230' rel='http://schemas.google.com/g/2005#overall'/><yt:statistics favoriteCount='0' viewCount='43378'/><yt:rating numDislikes='4' numLikes='226'/>

我的代码是:

        @Element(name="rating", required=false) 
    @Namespace(prefix="gd", reference="http://schemas.google.com/g/2005")
    public Rating rating;

    @Element(name="rating")     
    @Namespace(prefix="yt", reference="http://gdata.youtube.com/schemas/2007")
    public LikeRating ratingLike;

这样做的错误是:

org.simpleframework.xml.core.PersistenceException:字段“ratingLike”公共 com.devicefms.android.boardgamesreview.beans.VideoXML$VideoEntry$LikeRating com.devicefms.android.boardgamesreview.beans.VideoXML$ 上名称“rating”的重复注释VideoEntry.ratingLike 在 org.simpleframework.xml.core.StructureBuilder.process(StructureBuilder.java:258)

于 2012-10-04T15:37:08.427 回答
0

这本身不是一个修复程序,但我能够通过用单个 @ElementList 替换我的班级中 <atom:link/> 和 <link/> 的 2 个 @Element 条目并创建一个对象来解决这个问题这将满足两种链接类型。像这样的东西:

@NamespaceList({
   @Namespace(reference="http://www.w3.org/2005/Atom",prefix="atom")
})
public class Channel {

...

@ElementList(entry="link",inline=true,required=false)
public List<Link> links

...

}

public class Link {
   @Attribute(required=false)
    public String href;

    @Attribute(required=false)
    public String rel;

    @Attribute(name="type",required=false)
    public String contentType;

    @Text(required=false)
    public String link;
}
于 2012-10-26T19:14:54.017 回答
0

您列出的注释格式不正确。

它应该是

@Element(name="link")

如果注解有一个名为 value 的属性,则可以在不指定键的情况下对其进行分配。但在这种情况下,您尝试设置的属性是“名称”,其值为字符串类型。

问题的问题是'name'的整个赋值都包含在括号中,因此它试图将'value'设置为“name = link”,这就是它爆炸的原因,因为@Element注释没有'不指定值属性。

于 2011-05-12T03:45:02.677 回答
0

这已经解决了吗?除了马克的回应(使用集合)之外,还有没有合适的方法呢?我们如何防范其他没有变成集合的领域变成集合?

顺便说一句,我正在使用 RSS 提要。

于 2013-04-19T00:29:01.173 回答