Simple Xml - element declared twice

I am trying to wrap a set of classes based on Simple XML (Java Serializer) around an RSS feed. Sample delivery

<?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 I get when running the code is

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

And the error is true, because the name of a particular element occurs twice in xml, but in different ways.

The first link element is here.

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

Right below the channel tag. And then the next link tag is again in the Channel section in the following format

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

In the Channel.java class, I cannot have two variables with the same name. I tried changing the variable name to blogLink and tried to give the 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 that something is missing here, but I can’t put it on him. I would appreciate any help with this.

UPDATE

Channel class

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

Communication 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 changed the class names, but still points to the same error.

+6
source share
6 answers

These are two different elements. They differ in namespace. See how you can map namespaces (if they are supported at all by this simple XML).

Uh, found it in the doc:

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; 

etc.

+1
source

Since the link element appears twice (although they have a different namespace), you need to tell the link separately, blow 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

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

The annotations you provided are not formatted properly.

It should be

 @Element(name="link") 

If the annotation has one property with a name, it can be assigned without specifying a key. But in this case, the property you are trying to set is a "name" that has a value of type String.

The problem is that the whole purpose of “name” was enclosed in parentheses, so it tried to set “value” as “name = link”, so it exploded because @ Elemental annotation does not indicate the value property.

0
source

I have the same problem parsing xml with content:

 <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'/> 

my code is:

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

The error is:

org.simpleframework.xml.core.PersistenceException: Duplicate the annotation of the name 'rating' in the field 'ratingLike' public com.devicefms.android.boardgamesreview.beans.VideoXML $ VideoEntry $ LikeRating com.devicefms.android.boardgamesreview.beans.VideoXML $ VideoEnt .ratingLike on org.simpleframework.xml.core.StructureBuilder.process (StructureBuilder.java:258)

0
source

This is not a fix, but I was able to work around this problem by replacing the 2 @Element entries for <atom: link /> and <link /> in my class with a single @ElementList element and creating an object that satisfies both types of links. Something like that:

 @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; } 
0
source

Was it allowed? Besides Mark's answer (using the collection) is there a right way to do this? How will we protect against other fields that have not been turned into a collection, become collections?

BTW I work with RSS feeds.

0
source

Source: https://habr.com/ru/post/887888/


All Articles