gpt4 book ai didi

java - JAXB 解码忽略 SOAP 信封/ header 标记

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:19:08 27 4
gpt4 key购买 nike

我有一个正在构建的客户端,用于访问 Web 服务。我正在使用一些 JAXB 生成的类(Netbeans 6.9)来解码我的 xml 数据。

尝试从该 Web 服务解码 InputStream 响应时,我遇到了意外的元素错误,如果我将响应保存到文件,我也会遇到同样的意外元素错误。

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.w3.org/2003/05/soap-envelope", local:"Envelope"). Expected elements are <{http://www.cmicdataservices.com/}Authentication>,....

将数据保存到文件后,我可以进入并删除 SOAP 标记(信封、正文、headr),然后毫无问题地运行解码。

我还没有真正找到使解码忽略这些标签的方法。有谁知道如何忽略这些标签?

这是流返回的主要方法和类。

   public static void main(String[] args) {
JAXBContext jaxbContext = null;
try {
CMICData cmic = new CMICData();
jaxbContext = JAXBContext.newInstance("cmic.ajrs.com");
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();


GetCurrentDataVer1Response response = (GetCurrentDataVer1Response)
unmarshaller.unmarshal( cmic.getCMICIs("GetCurrentDataVer1"));
DatacenterDataVer1 dataSet = response.getGetCurrentDataVer1Result();

List products = dataSet.getAProductBase().getProductBase();
// print some primary keys to show data being processed.
for(Iterator<ProductBase> iter = products.iterator(); iter.hasNext();) {
ProductBase pb = iter.next();
System.out.println(pb.getPkID());
}

} catch (JAXBException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}


}

Netbeans 生成的类。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"getCurrentDataVer1Result"
})
@XmlRootElement(name = "GetCurrentDataVer1Response", namespace = "http://www.cmicdataservices.com/")
public class GetCurrentDataVer1Response {

@XmlElement(name = "GetCurrentDataVer1Result")
protected DatacenterDataVer1 getCurrentDataVer1Result;

/**
* Gets the value of the getCurrentDataVer1Result property.
*
* @return
* possible object is
* {@link DatacenterDataVer1 }
*
*/
public DatacenterDataVer1 getGetCurrentDataVer1Result() {
return getCurrentDataVer1Result;
}

/**
* Sets the value of the getCurrentDataVer1Result property.
*
* @param value
* allowed object is
* {@link DatacenterDataVer1 }
*
*/
public void setGetCurrentDataVer1Result(DatacenterDataVer1 value) {
this.getCurrentDataVer1Result = value;
}

}

最佳答案

有几个不同的选项:

选项#1

如果您收到作为 InputStream 的 XML 输入,您可以使用 StAX 解析它并获得 XMLStreamReader。然后,您可以将 XMLStreamReader 推进到您想要解码的本地根元素,并让 JAXB 解码它。

选项 #2

您可以使用 javax.xml.xpath库以选择要使用 JAXB 解码的本地根元素。有关 javax.xml.xpath 示例,请参见:

关于java - JAXB 解码忽略 SOAP 信封/ header 标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5568852/

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