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

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

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

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

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

1 ответ

Решение

Это поведение по умолчанию JAXB (Java Architecture для привязки XML), который является стандартом Java для определения того, как объекты Java конвертируются из XML и в 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, они просто будут проигнорированы, и вы сможете продолжить получать нужные вам части документа. До тех пор, пока в будущем все будет добавлено, а не удалено, у вас не должно возникнуть проблем.

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

Другие вопросы по тегам