gpt4 book ai didi

java - 在 Java 中解码 XML 时遇到问题

转载 作者:行者123 更新时间:2023-12-02 12:19:01 29 4
gpt4 key购买 nike

这是我收到的 xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Header/>
<soap-env:Body RequestId="1503948112779" Transaction="HotelResNotifRS">
<OTA_HotelResNotifRS xmlns="http://www.opentravel.org/OTA/2003/05" TimeStamp="2017-08-28T19:21:54+00:00" Version="1.003">
<Errors>
<Error Code="450" Language="en-us" ShortText="Unable to process " Status="NotProcessed" Type="3">Discrepancy between ResGuests and GuestCounts</Error>
</Errors>
</OTA_HotelResNotifRS>
</soap-env:Body>
</soap-env:Envelope>

这会被伪解码到 OTAHotelResNotifRS 对象中,您可以在该对象上获取 .getErrors() 。问题是没有与该位关联的类型,因此它作为 ElementNSImpl 形式的对象返回。我不控制 OTAHotelResNotifRS 对象,因此我最好的选择是将 .getErrors() 对象解码到我自己的 pojo 中。这是我的尝试。

@XmlRootElement(name = "Errors")
@XmlAccessorType(XmlAccessType.FIELD)
public class CustomErrorsType {
@XmlAnyElement(lax = true)
private String[] errors;

public String[] getErrors() {
return errors;
}
}

这是用于尝试将其解码到我的 CustomErrorsType 对象中的代码

Object errorsType = otaHotelResNotifRS.getErrors();
JAXBContext context = JAXBContext.newInstance(CustomErrorsType.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
CustomErrorsType customErrorsType = (CustomErrorsType)unmarshaller.unmarshal((Node)errorsType);

调用unmarshal时抛出以下异常

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.opentravel.org/OTA/2003/05", local:"Errors"). Expected elements are <{}Errors>

有什么想法吗?我在 xml 解码方面非常弱。

最佳答案

您忽略了响应中的 XML 命名空间,如 xmlns 属性中所定义。请参阅https://www.w3.org/TR/xml-names/有关命名空间和定义它们的属性的完整说明。

描述 XML 名称及其命名空间的标准表示法是 {namespace-uri}local-name。因此,异常实际上是在告诉您 CustomErrorsType 需要一个具有本地名称 Errors 和一个空命名空间 ({}) 的元素,但它遇到了一个具有本地名称的元素名称 Errors 和命名空间 http://www.opentravel.org/OTA/2003/05

尝试更改此设置:

@XmlRootElement(name = "Errors")

对此:

@XmlRootElement(name = "Errors", namespace = "http://www.opentravel.org/OTA/2003/05")

顺便说一句,如果您有权访问定义 SOAP 服务的 WSDL,则可以通过调用标准 JDK 工具 wsimport 使您的任务变得更加容易。以 WSDL 的位置作为参数。所有编码将由生成的 Service 和 Port 类隐式处理。

关于java - 在 Java 中解码 XML 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45929586/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com