Дочерний элемент без корневого элемента в Java

1

У меня есть xml-документ:

<root>
    <device>
        <v1>blah</v1>
    </device>
</root>

Я хочу разобрать этот документ, но

    <device>
        <v1>blah</v1>
    </device>

часть. Я хочу игнорировать корневой элемент. Как я могу развязать это с помощью jaxb?

Теги:
jaxb
stax
sax

2 ответа

1
Лучший ответ

Предполагая, что ваше определение JAXB ничего не знает о <root>, т.е. Вы не можете просто развязать все это и заглянуть внутрь результирующего объекта Root:

  1. Разберитесь в документ.
  2. Используйте обход XPath/DOM/все, чтобы получить [a] ссылку [s] на узел устройства [s].
  3. Используйте unmarshaller.unmarshal (узел).
  • 0
    Если вы используете анализатор StAX вместо DOM, вы получите гораздо лучшую производительность: stackoverflow.com/a/22464911/383861
  • 0
    Верно, но «Переход ... к элементу, который вы хотите демонтировать», может быть нетривиальным, особенно если вы хотите проанализировать атрибуты этого элемента или не можете обнаружить тривиально по имени элемента. Очевидно, что если документ большой или в нем имеется большое количество материала после рассматриваемого элемента, то вы захотите выполнить потоковую передачу, но я бы (лично) выполнял потоковую передачу только в том случае, если анализ в документе был запрещающим с точки зрения памяти или производительности.
0

Вы можете сделать следующее:

  • Разберите XML с помощью StAX XMLStreamReader.
  • XMLStreamReader к элементу, который вы хотите развязать.
  • Используйте один из методов unmarshal, которые используют XMLStreamReader.

пример

import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;

public class UnmarshalDemo {

    public static void main(String[] args) throws Exception {
        // Parse the XML with a StAX XMLStreamReader
        XMLInputFactory xif = XMLInputFactory.newFactory();
        StreamSource xml = new StreamSource("input.xml");
        XMLStreamReader xsr = xif.createXMLStreamReader(xml);

        // Advance the XMLStreamReader to the element you wish to unmarshal
        xsr.nextTag();
        while(!xsr.getLocalName().equals("device")) {
            xsr.nextTag();
        }

        // Use one of the unmarshal methods that take an XMLStreamReader
        JAXBContext jc = JAXBContext.newInstance(Device.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Device device = (Device) unmarshaller.unmarshal(xsr);
        xsr.close();
    }

}

Чтобы получить больше информации

Ещё вопросы

Сообщество Overcoder
Наверх
Меню