【问题标题】:SIMPLE XML, empty value parsing descriptionSIMPLE XML,空值解析说明
【发布时间】:2016-10-21 19:07:59
【问题描述】:

我正在根据本教程http://www.hermosaprogramacion.com/2015/05/tutorial-para-crear-un-lector-rss-en-android/在 Android 上创建一个 RSS 应用程序

我删除了一些我不想解析的标签,并且在原始 URL 上一切正常,福布斯 RSS“http://www.forbes.com/most-popular/feed”。一旦我更改了这个我想使用“http://aplicaciones.esi.us.es/antalumnos/rss.xml”的福布斯 RSS url,我就会收到这个错误:

06-20 13:51:44.961 11441-11494/com.herprogramacin.hermosaprogramacion W/System.err: org.simpleframework.xml.core.ValueRequiredException: Empty value for @org.simpleframework.xml.Element(data=false, name=description, required=true, type=void) on field 'descripcion' private java.lang.String com.herprogramacin.hermosaprogramacion.RssParse.Item.descripcion in class com.herprogramacin.hermosaprogramacion.RssParse.Item at line 11
06-20 13:51:44.971 11441-11494/com.herprogramacin.hermosaprogramacion W/System.err:     at org.simpleframework.xml.core.Composite.readInstance(Composite.java:580)
06-20 13:51:44.971 11441-11494/com.herprogramacin.hermosaprogramacion W/System.err:     at org.simpleframework.xml.core.Composite.readUnion(Composite.java:549)
06-20 13:51:44.971 11441-11494/com.herprogramacin.hermosaprogramacion W/System.err:     at org.simpleframework.xml.core.Composite.readElement(Composite.java:532)
06-20 13:51:44.971 11441-11494/com.herprogramacin.hermosaprogramacion W/System.err:     at org.simpleframework.xml.core.Composite.readElements(Composite.java:445)
06-20 13:51:44.971 11441-11494/com.herprogramacin.hermosaprogramacion W/System.err:     at org.simpleframework.xml.core.Composite.access$400(Composite.java:59)
06-20 13:51:44.971 11441-11494/com.herprogramacin.hermosaprogramacion W/System.err:     at org.simpleframework.xml.core.Composite$Builder.read(Composite.java:1383)
06-20 13:51:44.971 11441-11494/com.herprogramacin.hermosaprogramacion W/System.err:     at org.simpleframework.xml.core.Composite.read(Composite.java:201)
06-20 13:51:44.971 11441-11494/com.herprogramacin.hermosaprogramacion W/System.err:     at org.simpleframework.xml.core.Composite.read(Composite.java:148)
06-20 13:51:44.971 11441-11494/com.herprogramacin.hermosaprogramacion W/System.err:     at org.simpleframework.xml.core.Traverser.read(Traverser.java:92)
06-20 13:51:44.971 11441-11494/com.herprogramacin.hermosaprogramacion W/System.err:     at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:190)

第一行说“描述的空值”,但我不明白为什么。这是我的项目类代码,还有 2 个文件更多 por RSS 和 Channel:

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

/**
 * Clase que representa la etiqueta <item> del feed
 */

@Root(name = "item", strict = false)
public class Item {

    @Element(name="title")
    private String title;

    @Element(name="description", required=false)
    private String descripcion;

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

    public Item() {
    }

    public Item(String title, String descripcion, String link) {
        this.title = title;
        this.descripcion = descripcion;
        this.link = link;
        ;
    }

    public String getTitle() {
        return title;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public String getLink() {
        return link;
    }
}

我要使用的网址有问题吗?

【问题讨论】:

  • 堆栈跟踪的第一行显示“bla bla bla at line 11”。因此,如果您检查 URL 内容,在第 11 行有一个没有值的描述标签,即它是空的。所以不,您使用的 URL 没有问题。但我猜你还有一个问题(没有提到):How to handle empty tags using Simple XML framework?
  • 我认为 required=false 在空的情况下就足够了。谢谢你,我会检查这种情况的解决方案
  • required=false 仅用于将元素(或属性)标记为不强制存在。但在这种情况下,它是存在的,但它是空的,这显然是框架的一个问题。我认为一种方法是使用自定义反序列化,你可以在这里看到一个例子stackoverflow.com/a/25962865/2160877

标签: android xml rss


【解决方案1】:

将描述元素移动到新类中。
为了做到这一点,你需要更换

@Element(name="description", required=false)
private String descripcion;

@Element(name="description", required=false)
private Description descripcion;

然后,新建一个文件Description.java,如:

public class Description
{
    @Text(required=false)
    String descriptionText;

    public String getText()
    {
        return descriptionText;
    }
}

在这种情况下,只要描述标签为空,反序列化过程中就会跳过它,而你的descripcion字段将简单地为空。

【讨论】:

  • 感谢您的回答。我做到了,但同样的问题再次出现“org.simpleframework.xml.core.ValueRequiredException:@org.simpleframework.xml.Text 的空值(data=false,empty=,required=true)字段'descriptionText'公共java。类 com.herprogramacin.hermosaprogramacion.RssParse.Description 中的 lang.String com.herprogramacin.hermosaprogramacion.RssParse.Description.descriptionText 第 129 行"
  • 嗯,这对我来说适用于类似的用例。我对答案做了一个小的编辑。再试一次。
  • 现在正在工作,感谢 required = false !!!非常感谢你,真的。我现在的问题是其他的。我得到描述为字符串,但现在是一个描述对象。我应该如何将其解析为字符串? .如果我使用 description.toString() 我得到对象的标识符。 :(
  • 使用吸气剂,类似于我更新的答案。然后,你会打电话给description.getText()
  • 如果这回答了你的问题,那么请接受我的回答。
【解决方案2】:

这看起来是正确的,但问题可能出在 Channel 类上。频道也有描述。您的问题中显示的错误提到 description 是必需的(在 Item 类中它是可选的。可能是您缺少 Channel 类:@Element(name="description", required=false)?

【讨论】:

  • 我正在使用@Root(name = "channel", strict = false)。当 strict 为 false 时,解析将忽略未声明的元素。 Forbes RSS 在频道中有一个描述,它适用于我当前的代码。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-10-09
  • 2013-02-01
  • 2014-01-05
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 2014-10-11
  • 2019-09-13
相关资源
最近更新 更多