【问题标题】:XML unmarshal to Object in Java/KotlinXML 解组到 Java/Kotlin 中的对象
【发布时间】:2019-01-29 14:44:42
【问题描述】:

我想将一个 xml 字符串更改为一个对象,但它似乎一直在向我抛出错误,我不知道如何使用这些 @XmlRootElement 东西

只要查看/回复它,JAVA 也可以,虽然是用 kotlin 编写的

这是 XML 字符串

<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wx0b6dc231d20b379f1]]></appid>
<mch_id><![CDATA[1508319851]]></mch_id>
<nonce_str><![CDATA[mqy4nB6xGoyC1QPY]]></nonce_str>
<sign><![CDATA[2D9A3195E196F679D3916C5DC74754B4]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx2116190646297891sfae86747980208850875]]></prepay_id>
<trade_type><![CDATA[JSAPI]]></trade_type>
</xml>

这是我的数据类

@XmlRootElement
data class  WxPayResult(


val return_code: String = "",

val return_msg: String = "",


//return_code as SUCCESS will only return the following params
val appid: String? = null,

val mch_id: String? = null,

val device_info: String? = null,

val nonce_str: String? = null,

val sign: String? = null,

val result_code: String? = null,

val err_code: String? = null,

val err_code_des: String? = null,


//return_code and result_code both as success will only return the following params
val trade_type: String? = null,

val prepay_id: Int? = null,

val code_url: String? = null
)

这是我的代码,"xmlreturn" 是 xml 字符串

val jaxbContext = JAXBContext.newInstance(WxPayResult::class.java)
        val unmarshaller = jaxbContext.createUnmarshaller()

        val reader = StringReader(xmlreturn)
        val person = unmarshaller.unmarshal(reader)

这是错误

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"xml"). Expected elements are <{}wxPayResult>
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:741)
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:262)
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:257)
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:124)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1149)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:574)

我知道我可能需要在数据类中添加一些东西,但我不知道要添加什么。提前致谢。

【问题讨论】:

标签: java xml kotlin jaxb unmarshalling


【解决方案1】:

您的根元素的名称与您的 xml 根元素不同,这也是消息所暗示的。它需要wxPayResult,但你给它一个xml。

以wxPayResult 作为根元素传递一个XML,或者将name 提供给XMLRootElement,例如

@XmlRootElement(name = "xml")

【讨论】:

  • 感谢您的回复,我确实尝试添加 (name="xml") 但它无法获取值意味着我在 Person 对象中获得了 null 中的所有属性。你知道为什么会这样吗?
  • 是的,每个元素都需要@XmlElement。注意:如果名称也不同,您也可以提供name-attribute。
  • imgur.com/a/nsnaY9x 这是我得到的图片,你介意/知道我该怎么做吗@XmlElement?
  • 示例:@XmlElement var return_code : String? = null。您可能需要切换到var。
  • 刚刚测试过val。你不需要var,val 也可以工作......所以它只取决于你是否想改变你的变量;-)
猜你喜欢
  • 2012-04-21
  • 2020-02-10
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多