Разбор XML с устаревшим XSD

1

Я интегрируюсь на платформу с крупными предприятиями, и вендору нравится часто обновлять свой формат XML, хотя они пообещали, что изменения будут по-прежнему совместимы с обратной связью. У меня XSD, который работает... сейчас... но я бы хотел развернуть эту схему с нашим кодом приложения и не переустанавливать для каждого обновления веб-службы. В качестве дополнительного импульса язык настройки (на основе JVM) имеет очень хороший импорт типа XSD.

В качестве резервной копии я могу извлечь определенные элементы с помощью запросов XPath, но это гораздо менее приятно.

  • Как я могу продолжать анализировать эволюционирующий XML по сравнению с файлом схемы, который устарел, но не устарел?

Я ищу что-то вроде опции "свободный синтаксический анализ" или "игнорировать неизвестные теги", которые позволят мне получить доступ к тем частям документа, которые наше приложение знает и заботится. Любые новые теги могут быть отброшены - с точки зрения бизнеса, они неактуальны.

Теги:
parsing
xsd
gosu

1 ответ

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

Это поведение по умолчанию JAXB (Java Architecture for XML Binding), которое является стандартом Java для определения того, как объекты Java преобразуются из и в XML.

Если вы начинаете с XSD, предоставленного кем-то другим, вы можете создавать классы, используя инструмент xjc, который поставляется вместе с JDK.

> xjc vendor.xsd

см. как-генерировать-jaxb-classes-from-xsd

По умолчанию это создаст "сгенерированный" пакет классов, представляющий элементы, определенные в XSD. Если верхний элемент XML был VendorDocument, следующий код позволит вам играть с входным файлом:

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import generated.VendorDocument;

public class VendorMain {

  public static void main(String[] args) throws JAXBException, IOException {

    // create JAXB context
    JAXBContext context = JAXBContext.newInstance(VendorDocument.class);

    // unmarshal document from file
    Unmarshaller um = context.createUnmarshaller();
    VendorDocument vendorDoc = (VendorDocument) um.unmarshal(new FileReader("vendor.xml"));


    //Check what got read in by writing it out.  Will not have unknown tags.
    Marshaller m = context.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    m.marshal(vendorDoc, new File("output.xml"));

  }
}

Вы увидите, что если вы добавите дополнительные теги и атрибуты в входной файл vendor.xml, они просто проигнорируются, и вы можете продолжить доступ к тем частям требуемого документа. До тех пор, пока вещи будут добавлены в XSD только в будущем и не будут удалены, у вас не должно возникнуть проблемы.

В этом уроке был приведен фрагмент кода выше.

  • 0
    Блестящий, что это встроено.

Ещё вопросы

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