Пытаться размонтировать xml с помощью jaxb

Мне предоставлено xsd ответного сообщения и я пытаюсь разобрать ответ xml в классы, созданные jaxb. Сначала у меня возникла проблема, когда корневой элемент xml назывался «response», но был также вложенный класс, называемый «response», и поэтому возникали ошибки компиляции. Чтобы исправить это, я обнаружил, что в xsd я могу использовать аннотацию jaxb: class для изменения имени вложенного класса java, который создается, поскольку ниже вложенные классы теперь генерируются как «callReport7Response» вместо «response».


    
        
            
            
                
                    
                        
                            
                        
                    
                
            
            
            
                
                    
                        
                            
                        
                    
                
            
        
    

К сожалению, когда я пытаюсь развязать ответ, я получаю сообщение об ошибке, говоря, что он не может разобрать «callReport7Response» в «response»

Java выглядит так:

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {"any"})
        @XmlRootElement(name = "response")
        public static class CallReport7Response {

            @XmlAnyElement
            protected List any;
            @XmlAttribute
            protected String time;

Кажется, что он пытается передать мой вложенный объект в объект верхнего уровня.

09:28:34,608 ERROR [STDERR] java.lang.ClassCastException: uk.co.test.dashboard.dal.Response$Insurer$Subject$CallReport7$CallReport7Response cannot be cast to uk.co.test.dashboard.dal.Response

Я использую этот код для отмены:

Response response = new Response();
        StringReader reader = new StringReader(resp);
        try {
            JAXBContext context = JAXBContext.newInstance(response.getClass());
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Object o = unmarshaller.unmarshal(reader);
            response = (Response) o;
        } catch (JAXBException e) {
           //TODO Auto-generated catch block
            e.printStackTrace();
        }
3
nl ja de

1 ответы

<Сильный> schema.xsd

Вы должны переместить аннотацию схемы JAXB из вложенного элемента response в соответствующий сложный тип. Ниже приведена упрощенная схема XML, основанная на том, что вы описали в своем вопросе.

<?xml version="1.0" encoding="UTF-8"?>


    
        
            
                
                    
                        
                            
                                
                                    
                                        
                                            
                                        
                                    
                                    
                                        
                                            
                                        
                                    
                                
                            
                        
                    
                
            
        
    


<Сильный> ответ

Будет создан класс, подобный приведенному ниже (комментарии и аксессоры были удалены, чтобы сэкономить место).

package forum14582017;

import java.util.*;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"callReport7"})
@XmlRootElement(name = "response")
public class Response {

    @XmlElement(required = true)
    protected Response.CallReport7 callReport7;

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {"response"})
    public static class CallReport7 {

        @XmlElement(required = true)
        protected Response.CallReport7 .CallReport7Response response;

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {"any"})
        public static class CallReport7Response {

            @XmlAnyElement
            protected List any;
            @XmlAttribute(name = "time")
            protected String time;
            @XmlAnyAttribute
            private Map otherAttributes = new HashMap();

        }

    }

}

<Сильный> Demo

Используя демонстрационный код ниже с моделью JAXB, сгенерированной из приведенной выше схемы XML.

package forum14582017;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance("forum14582017");

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum14582017/input.xml");
        Response response = (Response) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(response, System.out);
    }

}

<Сильный> Input.xml/выход

Можно создать и использовать следующий XML.

<?xml version="1.0" encoding="UTF-8"?>

    
        
    

2
добавлено
Это сработало. Большое спасибо!
добавлено автор shawsy, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

IDE и редакторы — русскоговорящее сообщество
IDE и редакторы — русскоговорящее сообщество
393 участник(ов)

Общаемся, сравниваем и помогаем друг другу решать задачи с продуктами JetBrains, VS Code, Atom, vim, Emacs, Sublime и т.д. Всё в одном месте, ведь каждый из них хорош по своему. См. также: @js_ru, @typescript_ru, @react_js, @nodejs_ru, @javascript_jobs

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async