Spring JAXB - демонтаж XML-документа с проверкой схемы - PullRequest
2 голосов
/ 14 февраля 2012

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

<xs:myData xmlns:xs="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com example.xsd ">

Существует файл схемы, верхняя часть которого выглядит следующим образом:

<schema targetNamespace="http://www.example.com" 
elementFormDefault="qualified"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xs="http://www.example.com">

Я хотел бы демонтировать XML-документ с помощью Spring / JaxB и в конечном итоге преобразовать его в объект JPA. Я не уверен, что делать, поэтому я искал примеры на Google и придумал это http://thoughtforge.net/610/marshalling-xml-with-spring-ws-and-jaxb/

Я понимаю большинство из них, за исключением того, как или где используется схема.

Я видел другие примеры, где схема указана явно, то есть

SchemaFactory schemaFac = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema sysConfigSchema = schemaFac.newSchema(
                    new File("example.xsd"));
            unmarshaller.setSchema(sysConfigSchema);
            RootElement root = (RootElement)unmarshaller.unmarshal(
                    new File("example1.xml"));
  • Как схема, показанная в первой ссылке, используется для проверки XML-документа?
  • Есть ли недостатки в использовании Spring jaxb2Marshaller по сравнению с прямым использованием JAXB?
  • Каков эффект от наличия пространства имен рядом с аннотацией XmlElement? (См. Класс «Человек»)

Буду признателен за дополнительные примеры, показывающие Spring / REST с демаршаллингом с проверкой схемы

Спасибо

1 Ответ

4 голосов
/ 16 февраля 2012
  • Насколько я знаю, JAXB не анализирует атрибут xsi для разыменования XSD, загружает его и использует для проверки.Возможно, это было сделано для отключения автоматической проверки, в противном случае было бы проблематично отключить ее:)
  • Spring Jaxb2Marshaller, очевидно, был добавлен для реализации того же интерфейса org.springframework.oxm.Marshaller (который также реализуется с помощью CastorMarshaller, JibxMarshaller, ...).Он очень мощный и позволяет настраивать JAXBContext очень гибким способом (я не могу представить сценарий, когда предоставленного API недостаточно).С точки зрения шаблона новый Jaxb2Marshaller является компоновщиком, поэтому он ничего не добавляет к базовой функциональности JAXB.Но есть некоторые очевидные преимущества.Например, загрузка схемы очень проста.В статье контекст Spring ссылается на person.xsd (<property name="schema" value="classpath:schema/person.xsd"/>), который необходимо явно указать в ресурсах.Затем JAXB marshaller / unmarshaller будет использовать эту схему для проверки XML при генерации / загрузке XML.
  • @XmlElement(..., namepsace="xxx") автоматически сгенерирует этот элемент XML с указанным пространством имен.Это редкий случай, когда кто-то не использует пространства имен.Я бы сказал, что написание XSD без пространств имен - это ненормально, так как вы хотите избежать конфликта имен элементов.
  • Использовать JAXB с RestTemplate очень просто.Вы должны быть уверены, что среда выполнения JAXB находится в вашем пути к классам (JDK 6 уже имеет его), и ваш компонент помечен @XmlRootElement.Тогда просто используйте Person person = restTemplate.getForObject(restServiceUrl, Person.class),
...