2016-07-27 3 views
0

I'm с помощью Джексона XmlMapper на карту и XML в POJO, но у меня есть следующая проблема:Джексон XmlMapper карта от дочернего элемента

Мой XML выглядит следующим образом (не оригинал, только в качестве примера):

<?xml version="1.0" encoding="UTF-8"?> 
<result> 
    <pojo> 
     <name>test</name> 
    </pojo> 
</result> 

Проблема в том, что я не хочу разбирать объект «результат». Я не буду разбирать pojo как собственный объект. Могу ли я сделать это с помощью XmlMapper?

спасибо!

Артур

ответ

1

Вы можете сделать это, но вы должны написать какой-нибудь котел пластины код. Вы должны создать экземпляр XMLStreamReader, чтобы можно было выполнить индивидуальное чтение вашего ввода xml. Метод next() позволяет перейти к следующему событию разбора читателя. Это довольно сложный метод(), связанный с внутренними правилами читателя. Так что читайте документацию понимает особенности:

Из Javadoc:
INT javax.xml.stream.XMLStreamReader.next() кидает XMLStreamException

Получить следующее событие разбора - процессор может вернуть все смежных символьных данных в одном куске, или он может разбить его на несколько кусков . Если для свойства javax.xml.stream.isCoalescing установлено значение true , содержимое элемента должно быть объединено, и только одно событие CHARACTERS должно быть возвращено для непрерывного содержимого элемента или разделов CDATA. По ссылки на объекты по умолчанию должны быть расширены и прозрачно сообщаться в приложение . Исключение будет выбрано, если ссылка объекта не может быть расширена. Если содержимое элемента пуст (т. Е. Содержимое «") , то никаких сообщений о событиях CHARACTERS не сообщается.

Учитывая следующий XML: содержание textHello </приветствие>]]> другого содержания поведения вызова следующими() при нахождении на обув будет: 1 комментарий (COMMENT) 2- то секция символов (символы) 3- затем CDATA раздел (еще) 4- сИМВОЛЫ то символы секция следующего (еще сИМВОЛЫ) 5- то END_ELEMENT

Примечание: пустой элемент (например) будет сообщенными с два отдельно события: START_ELEMENT, END_ELEMENT - это сохраняет парсинг эквивалентности пустого элемента. Этот метод будет вызывать IllegalStateException, если он вызывается после того, как hasNext() возвращает false.

Возвращает: целочисленный код, соответствующий текущему событию синтаксического анализа

Позвольте мне проиллюстрировать, как приступить к испытанию блока:

@Test 
public void mapXmlToPojo() throws Exception { 
    XMLInputFactory factory = XMLInputFactory2.newFactory(); 
    InputStream inputFile = MapXmlToPojo.class.getResourceAsStream("pojo.xml"); 
    XMLStreamReader xmlStreamReader = factory.createXMLStreamReader(inputFile); 
    XmlMapper xmlMapper = new XmlMapper(); 
    xmlStreamReader.next(); 
    xmlStreamReader.next(); 
    Pojo pojo = xmlMapper.readValue(xmlStreamReader, Pojo.class); 
    Assert.assertEquals("test", pojo.getName()); 
} 
Смежные вопросы