【问题标题】:ConstructorException parsing XML with Retrofit and SimpleXML (Parameter does not have a match)ConstructorException 使用 Retrofit 和 SimpleXML 解析 XML(参数不匹配)
【发布时间】:2018-11-07 10:13:35
【问题描述】:

*解决方案在第一个答案中

我很不喜欢使用SimpleXML Converter,所以模型和注释可能是错误的。

这是我收到的XML

<?xml version="1.0" encoding="UTF-8"?>
<cards-summary-response xmlns="http:/mywebpage.com/rest-api">
    <card-summary>
        <identifier>51641C1B23931</identifier>
        <display-name>Debit Card</display-name>
        <program-name>plastic_debit</program-name>
        <status>Blocked</status>
    </card-summary>
    <card-summary>
        <identifier>4E1BDFCC1D6</identifier>
        <display-name>Virtual Debit</display-name>
        <program-name>virtual_debit</program-name>
        <status>Active</status>
    </card-summary>
</cards-summary-response>

我的模型:

CardSummaryResponse.kt

@Root(strict = false, name = "cards-summary-response")
data class CardSummaryResponse constructor(
    @ElementList(
        required = false,
        name = "card-summary",
        entry = "card-summary",
        inline = true,
        empty = true
    )
    var cardsSummaryList: MutableList<CardSummary>? = null
)

CardSummary.kt

@Root(name = "card-summary")
data class CardSummary @JvmOverloads constructor(
    @field:Element(name = "identifier", required = true)
    var identifier: String = "",
    @field:Element(name = "status", required = true)
    var status: String = ""
)

API 配置:

retrofit = Retrofit.Builder()
    .addConverterFactory(SimpleXmlConverterFactory.createNonStrict(
            Persister(AnnotationStrategy())
        )
    )
    .baseUrl(CallsConfiguration.BASE_URL_WIRECARD)
    .client(clientBuilder.build())
    .build()
service = retrofit.create(RetrofitInterface::class.java)

还有RetrofitInterface(这个类是Java的):

@GET("webservices/wd-test.phtml")
Call<CardSummaryResponse> getCardsSummary();

我总是遇到同样的异常:

java.lang.Error: org.simpleframework.xml.core.ConstructorException: 参数“card-summary”在类中没有匹配项 com.app.account.model.CardSummaryResponse

有什么建议吗?

【问题讨论】:

  • 可能是错字? @Root(strict = false, name = "card-summary-response") 应该是 cards-summary-response
  • 我的错误。但我已经修复了它,仍然在抛出Exception

标签: kotlin xml-parsing retrofit


【解决方案1】:

我已经设法使用以下模型使其工作:

CardSummaryResponse.tk

@Root(strict = false, name = "cards-summary-response")
data class CardSummaryResponse constructor(
    @field:ElementList(
        required = false,
        name = "card-summary",
        entry = "card-summary",
        inline = true,
        empty = true
    )
    var cardsSummaryList: MutableList<CardSummary>? = null
)

CardSummary.tk

@Root(name = "card-summary")
data class CardSummary constructor(
    @field:Element(name = "identifier", required = true)
    var identifier: String = "",
    @field:Element(name = "status", required = true)
    var status: String = ""
)

【讨论】:

  • How we can get attribute like: @Path("enclosure") @param:Attribute(name = "url") var url: String = "", I am getting error: "Caused by: org.simpleframework.xml.core.ConstructorException: Parameter 'enclosure[1]/@url' does not have a match in class
  • 如果您遇到此错误:“@org.simpleframework.xml.Element 的值为空...”。使用 required = false 来防止空值,例如:
【解决方案2】:

就我而言,我在数据类中使用了'val'。花了3个小时后,我找到了解决方案:只需将'val替换为'var'并给出default value.

以下是我的数据类在解决方案后运行良好:

sealed class Feeds {

@Root(name = "rss", strict = false)
data class RssFeed constructor(@field:Element(name = "channel") var channel: RssChannel? = null) :
    Feeds()

@Root(name = "channel", strict = false)
data class RssChannel constructor(
    @field:ElementList(
        name = "item",
        inline = true,
        required = false
    ) var item: List<RssItem>? = null
) : Feeds()

@Root(name = "item", strict = false)
data class RssItem constructor(
    @field:Element(name = "title") var title: String = "",
    @field:Element(name = "description") var description: String = "",
    @field:Element(name = "link") var link: String = ""
) : Feeds()
}

编码愉快!!!

【讨论】:

    猜你喜欢
    • 2016-03-07
    • 2016-09-18
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    相关资源
    最近更新 更多