如何将这个 xml 解析为 java 对象(Retrofit2+SimpleXML)? (PersistenceException 错误)
How to parse this xml to java object (Retrofit2+SimpleXML)? (PersistenceException error)
我的 Retrofit 调用失败并出现错误:
org.simpleframework.xml.core.PersistenceException: Element 'item' is already used with @org.simpleframework.xml.ElementList(data=false, empty=true, entry=, inline=false, name=item, required=false, type=void) on field 'medias' private java.util.ArrayList packageName.FeedTag.medias at line 58
我猜是由于错误地将 XML 映射到 POJO class。
所以,谁能告诉我我的代码有什么问题吗?我试过查看 SimpleXML 示例和教程,但找不到与我的用例有关的信息。 (这是我第一次使用 Retrofit and/or SimpleXML。)
这是我的XML
<xml>
<feed>
<item>
<id>0</id>
<title>Lorem ipsum</title>
</item>
<item>
<id>1</id>
<title>Lorem ipsum dolor</title>
<comments>
<item>
<id>3</id>
</item>
</comments>
<medias>
<item>
<id>4</id>
<title>Media 1</title>
</item>
<item>
<id>8</id>
<title>Media 2</title>
</item>
</medias>
</item>
</feed>
</xml>
我的对象是这样的:
XmlTag.java
@Root(name = "item", strict = false)
public class XmlTag{
@Path("feed")
@ElementList(name = "item", required = false)
private List<FeedTag> feeds;
//empty constructor, setter, getter...
}
FeedTag.java
@Root(name = "item", strict = false)
public class FeedTag{
@Element(name = "title", required = false)
private String title;
@Path("comments")
@ElementList(name = "item", required = false)
private List<CommentTag> comments;
@Path("medias")
@ElementList(name = "item", required = false)
private List<MediaTag> medias;
//empty constructor, setter, getter...
}
CommentTag 和 MediaTag 类似于 FeedTag。
经过一些 T&E,我终于发现了我的代码有什么问题。
这是因为 @ElementList(name = "item", required = false)
行中没有 inline=true
。根据我的反复试验,使用该参数,simplexml 仅解析给定 @Path', so other tags with same tag name is safe as their
标签的直接 <item/>
子标签尚未被其他标签使用。
所以,只要我确保任何 @ElementList
个可能有重复标签名称的标签有 inline=true
,我之前得到的 PersistenceException
就不会 return.
我的 Retrofit 调用失败并出现错误:
org.simpleframework.xml.core.PersistenceException: Element 'item' is already used with @org.simpleframework.xml.ElementList(data=false, empty=true, entry=, inline=false, name=item, required=false, type=void) on field 'medias' private java.util.ArrayList packageName.FeedTag.medias at line 58
我猜是由于错误地将 XML 映射到 POJO class。
所以,谁能告诉我我的代码有什么问题吗?我试过查看 SimpleXML 示例和教程,但找不到与我的用例有关的信息。 (这是我第一次使用 Retrofit and/or SimpleXML。)
这是我的XML
<xml>
<feed>
<item>
<id>0</id>
<title>Lorem ipsum</title>
</item>
<item>
<id>1</id>
<title>Lorem ipsum dolor</title>
<comments>
<item>
<id>3</id>
</item>
</comments>
<medias>
<item>
<id>4</id>
<title>Media 1</title>
</item>
<item>
<id>8</id>
<title>Media 2</title>
</item>
</medias>
</item>
</feed>
</xml>
我的对象是这样的:
XmlTag.java
@Root(name = "item", strict = false)
public class XmlTag{
@Path("feed")
@ElementList(name = "item", required = false)
private List<FeedTag> feeds;
//empty constructor, setter, getter...
}
FeedTag.java
@Root(name = "item", strict = false)
public class FeedTag{
@Element(name = "title", required = false)
private String title;
@Path("comments")
@ElementList(name = "item", required = false)
private List<CommentTag> comments;
@Path("medias")
@ElementList(name = "item", required = false)
private List<MediaTag> medias;
//empty constructor, setter, getter...
}
CommentTag 和 MediaTag 类似于 FeedTag。
经过一些 T&E,我终于发现了我的代码有什么问题。
这是因为 @ElementList(name = "item", required = false)
行中没有 inline=true
。根据我的反复试验,使用该参数,simplexml 仅解析给定 @Path', so other tags with same tag name is safe as their
标签的直接 <item/>
子标签尚未被其他标签使用。
所以,只要我确保任何 @ElementList
个可能有重复标签名称的标签有 inline=true
,我之前得到的 PersistenceException
就不会 return.