Хобрук: Ваш путь к мастерству в программировании

Используйте JAXB для создания объекта из строки XML

Как я могу использовать приведенный ниже код, чтобы демаршалировать строку XML и сопоставить ее с объектом JAXB ниже?

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Person person = (Person) unmarshaller.unmarshal("xml string here");

@XmlRootElement(name = "Person")
public class Person {
    @XmlElement(name = "First-Name")
    String firstName;
    @XmlElement(name = "Last-Name")
    String lastName;
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}
28.03.2011

Ответы:


1

Чтобы передать XML-контент, вам нужно обернуть его в Reader и вместо этого демаршалировать:

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

StringReader reader = new StringReader("xml string here");
Person person = (Person) unmarshaller.unmarshal(reader);
28.03.2011
  • Не могли бы вы расширить этот ответ, включив в него XML-строку, содержащую конверт SOAP? 11.03.2014
  • что, если вы хотите использовать Reader в сочетании с определенным классом bean-компонентов? Поскольку нет unmarshall(Reader, Class) метода. Например. есть ли способ преобразовать Reader в javax.xml.transform.Source? 13.07.2016
  • В моем случае работаю как: JAXBElement<MyObject> elemento = (JAXBElement<MyObject>)unmarshaller.unmarshal(reader); MyObject object = elemento.getValue(); 12.01.2017
  • @bvdb Вы можете использовать javax.xml.transform.stream.StreamSource, у которого есть конструкторы, принимающие Reader, File или InputStream. 22.12.2017
  • Спасибо! В моем случае мне нужно было сделать немного другое: Person person = (Person) ((JAXBElement) unmarshaller.unmarshal (reader)). GetValue (); 08.05.2020

  • 2

    Или, если вам нужен простой однострочник:

    Person person = JAXB.unmarshal(new StringReader("<?xml ..."), Person.class);
    
    20.03.2012
  • Это должен быть принятый ответ. Это немного проще. 22.04.2016
  • Очень простой. Я полностью согласен, это должен быть принятый ответ. 17.06.2016
  • Я действительно не согласен с приведенными выше комментариями. Это, конечно, проще, но он создает контекст на лету, поэтому это может повлиять на производительность, даже если контекст в конечном итоге кэшируется. Используйте с осторожностью. 02.02.2017
  • Итак, какова альтернатива, если мы хотим предоставить класс демаршаллеру? Единственный метод принимает параметр (узел, класс), и здесь у нас есть строка. 14.04.2017
  • В этой краткой версии я не получаю ошибок синтаксического анализа, полезных для отладки конфигурации. Наверное, что-то упускаю ... 23.05.2018
  • Я собираюсь с этим :) 22.11.2018
  • Я понимаю, что здесь не задействовано приведение типов, вместо этого методу демаршалирования передается тип (?). 10.01.2019

  • 3

    Нет unmarshal(String) метода. Вы должны использовать Reader:

    Person person = (Person) unmarshaller.unmarshal(new StringReader("xml string"));
    

    Но обычно вы получаете эту строку откуда-то, например из файла. В таком случае лучше передать сам FileReader.

    28.03.2011

    4

    Если у вас уже есть xml и имеется более одного атрибута, вы можете обработать его следующим образом:

    String output = "<ciudads><ciudad><idCiudad>1</idCiudad>
    <nomCiudad>BOGOTA</nomCiudad></ciudad><ciudad><idCiudad>6</idCiudad>
    <nomCiudad>Pereira</nomCiudad></ciudads>";
    DocumentBuilder db = DocumentBuilderFactory.newInstance()
        .newDocumentBuilder();
    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(output));
    
    Document doc = db.parse(is);
    NodeList nodes = ((org.w3c.dom.Document) doc)
        .getElementsByTagName("ciudad");
    
    for (int i = 0; i < nodes.getLength(); i++) {           
        Ciudad ciudad = new Ciudad();
        Element element = (Element) nodes.item(i);
    
        NodeList name = element.getElementsByTagName("idCiudad");
        Element element2 = (Element) name.item(0);
        ciudad.setIdCiudad(Integer
            .valueOf(getCharacterDataFromElement(element2)));
    
        NodeList title = element.getElementsByTagName("nomCiudad");
        element2 = (Element) title.item(0);
        ciudad.setNombre(getCharacterDataFromElement(element2));
    
        ciudades.getPartnerAccount().add(ciudad);
    }
    }
    
    for (Ciudad ciudad1 : ciudades.getPartnerAccount()) {
    System.out.println(ciudad1.getIdCiudad());
    System.out.println(ciudad1.getNombre());
    }
    

    метод getCharacterDataFromElement

    public static String getCharacterDataFromElement(Element e) {
    Node child = e.getFirstChild();
    if (child instanceof CharacterData) {
    CharacterData cd = (CharacterData) child;
    
    return cd.getData();
    }
    return "";
    }
    
    09.12.2016
    Новые материалы

    Пример O (n²)
    Две суммы: найти все пары, сумма которых равна целевому значению const arr = [1,4,5,7,9,3,1,2,-4,-6] Целевое значение = 9 Использование Brute Force для этого случая будет выполняться с..

    Правильное тестирование машинного обучения: обнаружение ошибок в данных.
    Эта статья была первоначально размещена на нашем сайте компании . Платформа для разработчиков Lakera позволяет командам машинного обучения создавать отказоустойчивые модели компьютерного..

    Обучение SAP FICO в NOIDA.
    Лучший провайдер SAP Training с целевым размещением SAP-коучинга в Нойде. Наш курс SAP концентрируется от коучинга базового уровня до продвинутого уровня и охватывает как функциональные, так и..

    Sinkhorn Knopp: поиск оптимального транспорта для выравнивания данных
    В области выравнивания данных и оптимального транспорта алгоритм Синкхорна-Кноппа стал мощным инструментом для решения задач оптимизации транспорта. С приложениями, варьирующимися от сопоставления..

    Мой начальный путь к микросервисам с Spring Boot
    Почему мы используем микросервисы? Микросервисы — это шаблон проектирования программного обеспечения, который включает создание большого приложения в виде набора небольших независимых..

    Уменьшите количество шаблонов при запуске тестов Kotlin
    Используя изящный трюк Kotlin, вы можете сделать свои тесты чистыми и простыми для понимания и обслуживания. Тестирование должно быть легким. Если ваши тесты слишком сложны и сложны в..

    Понимание React.js: гармоничная симфония компонентов и модульность в стиле LEGO
    Понимание React.js: гармоничная симфония компонентов и модульность в стиле LEGO Представляем искусство и науку, лежащую в основе строительных блоков React.js, React Components, которые помогают..