当前位置: 首页 > 知识库问答 >
问题:

Kotlin-使用simpleXML解析xml内联列表

戎洛华
2023-03-14

我正在尝试使用kotlin中的simplexml解析rss提要。

该订阅源是itunes的顶级播客订阅源

返回的数据具有以下结构:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Top Audio Podcasts</title>
    <link>https://rss.itunes.apple.com/api/v1/us/podcasts/top-podcasts/all/10/explicit.rss</link>
    <lastBuildDate>Fri, 13 Jul 2018 01:36:19 -0700</lastBuildDate>
    <atom:link rel="self" type="application/rss+xml" href="https://rss.itunes.apple.com/api/v1/us/podcasts/top-podcasts/all/10/explicit.rss"/>
    <atom:link rel="alternate" type="text/html" href="https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=26&amp;popId=28"/>
    <description>iTunes Store : Top Audio Podcasts</description>
    <category>iTunes Store</category>
    <copyright>Copyright © 2018 Apple Inc. All rights reserved.</copyright>
    <item>
      <title>The Wilderness - Crooked Media</title>
      <category domain="">Crooked Media</category>
      <link>https://itunes.apple.com/us/podcast/the-wilderness/id1408796715?mt=2</link>
      <guid>https://itunes.apple.com/us/podcast/the-wilderness/id1408796715?mt=2</guid>
      <description>The Wilderness</description>
      <category>podcast</category>
      <category>News &amp; Politics</category>
      <category>Podcasts</category>
      <category>Society &amp; Culture</category>
      <category>History</category>
      <pubDate>Fri, 6 Jul 2018 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Aaron Mahnke's Cabinet of Curiosities - HowStuffWorks &amp; Aaron Mahnke</title>
      <category domain="https://itunes.apple.com/us/artist/howstuffworks-aaron-mahnke/284341002?mt=2">HowStuffWorks &amp; Aaron Mahnke</category>
      <link>https://itunes.apple.com/us/podcast/aaron-mahnkes-cabinet-of-curiosities/id1396546917?mt=2</link>
      <guid>https://itunes.apple.com/us/podcast/aaron-mahnkes-cabinet-of-curiosities/id1396546917?mt=2</guid>
      <description>Aaron Mahnke's Cabinet of Curiosities</description>
      <category>podcast</category>
      <category>History</category>
      <category>Podcasts</category>
      <category>Society &amp; Culture</category>
      <pubDate>Tue, 10 Jul 2018 00:00:00 +0000</pubDate>
    </item>
  </channel>
</rss>

我关心的部分是条目标签包含的播客列表。

我的模型类如下所示:

@Root(name = "channel", strict = false)
data class Chart @JvmOverloads constructor(
        @field:ElementList(entry = "item", inline = true)
        @param:ElementList(entry = "item", inline = true)
        val podcasts: List<Entry>? = null)

@Root(name = "item", strict = false)
data class Entry @JvmOverloads constructor(
        @field:Element(name = "description")
        @param:Element(name = "description")
        val title: String? = null,

        @field:Element(name = "category")
        @param:Element(name = "category")
        val artist: String? = null,

        @field:Element(name = "guid")
        @param:Element(name = "guid")
        val guid: String? = null)

我有一个简单的单元测试,从文件中加载xml,将其传递给简单的exml反序列化器,然后将输出与一些预期的模型进行比较。

当我运行测试时,我得到一个异常:

org.simpleframework.xml.core.ValueRequiredException: Unable to satisfy @org.simpleframework.xml.ElementList(entry=item, inline=true, data=false, name=, type=void, required=true, empty=true) on field 'podcasts' private final java.util.List Chart.podcasts for class Chart at line 2

向@ElementList注释中添加必需=false会删除此错误,但反序列化器会为列表返回null。

我最好的猜测是反序列化器找不到项目列表,尽管根据我对@ElementList的理解,使用条目字段应该允许它找到标签。

这段代码的使用案例是形成一个Android应用程序的网络层,该应用程序依赖Refught2进行REST调用。

谢谢你在这方面的帮助。

注意:使用@Param和@Field声明是为了对抗不同的异常,我从这个问题中得到了这个想法

共有1个答案

金飞翼
2023-03-14

我找到了解决办法。

第一个问题是,我的根元素不是代表频道标签的图表,我需要一个包装类,我称之为ChartFeed来代表rss标签。

我意识到了这一点,在图表对象的标题标签上添加了一个元素,这也是不可查找的。

我完成的数据类如下所示:

@Root(name = "rss", strict = false)
data class ChartFeed(
        @field:Element(name = "channel")
        @param:Element(name = "channel")
        val chart: Chart? = null)

@Root(name = "channel", strict = false)
data class Chart @JvmOverloads constructor(
        @field:ElementList(entry = "item", inline = true)
        @param:ElementList(entry = "item", inline = true)
        val podcasts: List<Entry>? = null)

@Root(name = "item", strict = false)
data class Entry @JvmOverloads constructor(
        @field:Path("description")
        @field:Text(required = false)
        @param:Path("description")
        @param:Text(required = false)
        val title: String? = null,

        @field:Path("category")
        @field:Text(required = false)
        @param:Path("category")
        @param:Text(required = false)
        val artist: String? = null,

        @field:Element(name = "guid")
        @param:Element(name = "guid")
        val guid: String? = null)

我已经将一些字段/参数的@Element标记更改为@Path和@Text的组合,这是因为通道和项目xml对象都重用了导致此异常的相同标记:

org.simpleframework.xml.core.PersistenceException: Element 'category' is already used with @org.simpleframework.xml.Element(name=category, type=void, data=false, required=true) on field 'artist' private final java.lang.String Entry.artist at line 18

这里详细介绍了我使用的解决方案

 类似资料:
  • 问题内容: 我知道这个问题已经被问了很多遍了,但是我没有得到任何适合我情况的建议,因此我在网上和这里进行搜索,尝试了所有方法,但没有任何效果。我只需要用命名空间cap解析此XML:并且只需要其中的四个条目。 我正在使用simpleXML,并且设置了一个小的简单测试脚本,它非常适合解析常规元素。我无法为自己的狄更斯找到或获得一种使用命名空间解析元素的方法。 这是一个小示例测试脚本,其中包含我正在使用

  • 我正在尝试使用SimpleXML将改装xml响应序列化到一个对象中。 但是出现以下例外情况: org.simpleframework.xml.core.值必需异常:无法满足@org.simpleframework.xml.ElementList(data=false,空=true,入口=,内联=true,名称=ALLFile,必需=true,类型=无效)字段'file" 响应示例: 对象: 我收到

  • 问题内容: 我有这样的XML: 现在,我学习Kotlin进行翻新。我包括用于解析xml的库,但我不明白如何创建用于解析此xml的对象。我有对象: 但我有错误: rg.simpleframework.xml.core.ConstructorException:默认构造函数无法接受类ac中方法“ aries”上的@ org.simpleframework.xml.Element(data = fals

  • 问题内容: 如何使用simpleXML在xml文件中编辑值? 我知道如何创建文件,但不知道如何编辑现有文件中的值? 问题答案: 确保可以使用SimpleXML进行编辑: 看一下例子。

  • 问题内容: 我有一个丑陋的XML,上面有很多名称空间,当我尝试通过simpleXML加载它(如果我指示第一个名称空间)时,我会得到一个xml对象,但是后面带有其他名称空间的标记不会使它成为该对象。 如何解析该XML? 我试图用下面的代码解析它 但是$ xml对象仅包含以下内容 问题答案: 我认为您需要注册名称空间并使用XPath进行访问。如下所示的内容应该可以帮助您(我没有设施可以对此进行测试)。

  • 主要内容:什么是 PHP SimpleXML?,安装,PHP SimpleXML 实例,实例 1,实例 2,实例 3,更多 PHP SimpleXML 的信息PHP SimpleXML 处理最普通的 XML 任务,其余的任务则交由其它扩展处理。 什么是 PHP SimpleXML? SimpleXML 是 PHP 5 中的新特性。 SimpleXML 扩展提供了一种获取 XML 元素的名称和文本的简单方式。 与 DOM 或 Expat 解析器相比,SimpleXML 仅仅用几行代码就可以从 XM