Я интегрируюсь на платформу с крупными предприятиями, и вендору нравится часто обновлять свой формат XML, хотя они пообещали, что изменения будут по-прежнему совместимы с обратной связью. У меня XSD, который работает... сейчас... но я бы хотел развернуть эту схему с нашим кодом приложения и не переустанавливать для каждого обновления веб-службы. В качестве дополнительного импульса язык настройки (на основе JVM) имеет очень хороший импорт типа XSD.
В качестве резервной копии я могу извлечь определенные элементы с помощью запросов XPath, но это гораздо менее приятно.
Я ищу что-то вроде опции "свободный синтаксический анализ" или "игнорировать неизвестные теги", которые позволят мне получить доступ к тем частям документа, которые наше приложение знает и заботится. Любые новые теги могут быть отброшены - с точки зрения бизнеса, они неактуальны.
Это поведение по умолчанию 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 только в будущем и не будут удалены, у вас не должно возникнуть проблемы.
В этом уроке был приведен фрагмент кода выше.