JAXB unmarshaling Игнорирование тегов конверта / заголовка SOAP - PullRequest
6 голосов
/ 06 апреля 2011

У меня есть клиент, которого я создаю для доступа к веб-сервису. Я использую некоторые сгенерированные JAXB классы (Netbeans 6.9), чтобы демонтировать мои данные XML.

Я получаю неожиданные ошибки элемента при попытке разархивировать ответ 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), а затем без проблем запустить демаршалинг.

Я не нашел способа заставить демаршалинг игнорировать эти теги. Кто-нибудь знает, что можно сделать, чтобы игнорировать эти теги?

Вот метод main и класс, возвращаемый потоком.

   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 Ответ

5 голосов
/ 06 апреля 2011

Есть несколько вариантов:

Вариант № 1

Если вы получите XML-вход как InputStream, вы можете проанализировать его с помощью StAX и получить XMLStreamReader. Затем вы можете переместить XMLStreamReader к локальному корневому элементу, который вы хотите демонтировать, и сделать так, чтобы JAXB его демонтировал.

Вариант № 2

Вы можете использовать библиотеку javax.xml.xpath, чтобы выбрать локальный корневой элемент, который вы хотите разархивировать с помощью JAXB. Для примера javax.xml.xpath см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...