Разбор 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, они просто будут проигнорированы, и вы сможете продолжить получать нужные вам части документа. До тех пор, пока в будущем все будет добавлено, а не удалено, у вас не должно возникнуть проблем.
Фрагмент кода выше был адаптирован из этого урока.