JAXB unmarshaling忽略SOAP Envelope / Header标记

我有一个客户端我正在构建用于访问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 ,.... 

将数据保存到文件后,我可以进入并删除SOAP标记(信封,正文,标题),然后运行解组而没有任何问题。

我还没有找到一种方法让解组忽略这些标签。 有谁知道忽略这些标签可以做些什么?

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

  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 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

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

选项#2

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

  • 使用java拆分xml文件