简单的Xml - 元素声明两次错误 [英] Simple Xml - Element Declared Twice Error

查看:125
本文介绍了简单的Xml - 元素声明两次错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试围绕RSS Feed包装一组基于Simple XML(Java Serializer)的类。样本Feed是

I have been trying to wrap a set of classes based on Simple XML (Java Serializer) around a RSS Feed. The sample feed is

<?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>

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

The error that I am getting while running the code is

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

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

And the error is fair enough because the particular element name occurs twice in the xml but in different ways.

第一个link元素在这里

The first link element is here

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

它直接位于Channel标签下。然后下一个链接标记再次位于Channel下面,格式如下

Its directly under the Channel tag. And then the next link tag is again under Channel in the following format

< atom10:link xmlns:atom10 =http:// www .w3.org / 2005 / Atomrel =selftype =application / rss + xmlhref =http://feeds.feedburner.com/codinghorror/>

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

In Channel.java class I cannot have two variables with the same name link. I tried changing a variable name to blogLink and tried giving name in the Element annotation and Eclipse gave me this error

 Change was

@Element("name=link")


Result is

The attribute value is undefined for the annotation Element

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

I know I am missing something here but I am not able to put my finger on it. I would appreciate any help on this.

更新

渠道类

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

public atomlink getAtomLink() {
    return atomlink;
}

Link Class

Link Class

   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;
}

}

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

I have changed the class names and yet it still points to the same error.

推荐答案

因为链接元素出现两次(虽然它们有不同的命名空间),你需要告诉 link ,吹响是我的全部答案:

Because the link element appears twice(though they have different namespace), you need to tell link apart, blew is my whole answer:

1) 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 method

2) TestSimpleXmlConvert method

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();
        }
    }
}

这篇关于简单的Xml - 元素声明两次错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆