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

标签 java web-services jaxb

我正在构建一个用于访问 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 标记(envelope、body、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/25528977/

相关文章:

java - Liferay 6.2 第一个应用程序构建失败 - 在 build-common-ivy.xml :81: HTTP Authorization failure

java - 卡夫卡流: Flushing intermediate Windowed results as commit interval and window time are not in sync

java - FedEx 跟踪 API 错误 9040 - Java Web 服务

java - 用于处理异步 HTTP 请求/响应的体系结构 : ESB vs Async Http Client library

xml - 如何将 jar 文件中的架构 (XSD) 导入另一个架构 (XSD)

java - Maven:在部署步骤之前设置版本会导致缺少 Artifact

java - 安装 JAX-RS(REST Web 服务)1.1 时失败。 java.lang.NullPointerException异常

java - Jaxb Xml 到 java.awt

xml - JAXB XJC 编译器忽略 XML 模式文档上的 mixed=true

java - 如何在特定时间后关闭 ProgressDialog