2010-06-28 4 views
0

очень обобщенное и упрощенное описание сценария:JAXB и проверка на части схемы с помощью схемы?

  • Application создает экземпляры JAXB через UI,
  • Экземпляры JAXB построены на разных стадиях состоят в конце концов,
  • Как это делается, я должен выполните проверку экземпляров JAXB, созданных на каждом шаге, против XSD, чтобы убедиться, что уровень пользовательского интерфейса не создает бессмысленности.

Теперь схема определяет сложные типы A, B и C. Схема указывает, что XML-документ должен иметь элемент верхнего уровня A, и это может содержать несколько B, и это необязательно может включать C. Я создаю экземпляр JAXB для B и абсолютно необходимо проверить это на основе определения сложного типа в XSD, прежде чем вложить его в группу A. Однако проверка этого не произойдет, если я проверю все XSD.

Вопросы: Как проверить экземпляр JAXB только на часть XSD, из которой был сгенерирован ее класс?

Как насчет использования схемы для генерации схемы из класса JAXB, какой экземпляр я хочу проверить, а затем проверить на это? Считаете ли вы, что это может сработать? Любые другие идеи?

У меня нет опыта работы с схемами и скоро начнется прототипирование этого решения.

Примечание: на самом деле схемы не такие простые, как в приведенном выше примере, и решение о создании некоторого всегда действующего макета A не представляется возможным. Не говоря уже о том, что такая валидация будет, по меньшей мере, на сотни мест.

ответ

1

создать отдельную схему для элемента, который вы хотите проверить, где этот элемент находится на корневом уровне. , чтобы обойти отсутствие @xmlRoottag см 101 ways to marshal objects with JAXB

0

При работе с xjc и schemagen инструментов, пожалуйста, рассмотреть ту же концепцию, которую мы используем в Java. В java каждый класс является скелетом, а объект - экземпляром. То же самое, что нам нужно рассматривать XSD как скелет и XML как экземпляр.

XJC инструмент: -Xsd to Java Class Или Unmarshaling

Рассмотрим ниже XSD с пространствами имен, например. Инструмент xjc будет генерировать класс java вместе с информацией о пакете и объектной фабрикой.

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ir="http://irctc.org/service" targetNamespace="http://irctc.org/service"> 
    <xsd:element name="Customer" type="ir:CustomerType"/> 
    <xsd:complexType name="CustomerType"> 
     <xsd:sequence> 
      <xsd:element name="name" type="xsd:string"/> 
      <xsd:element name="src" type="xsd:string"/> 
      <xsd:element name="dest" type="xsd:string"/> 
      <xsd:element name="price" type="xsd:float" minOccurs="0"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

Использование ниже команды

D:\>xjc Customer.xsd parsing a schema... compiling a schema... org\irctc\service\CustomerType.java org\irctc\service\ObjectFactory.java org\irctc\service\package-info.java

Примечание: - Если у вас есть несколько классов Java, то вы можете использовать jaxb.index файл вместо использования ObjectFactory.java.

SchemaGen инструмент: -Java Class to Xsd Или Marshaling

Давайте предположим, что мы хотим создать файл XSD, используя класс Java, то сначала нужно создать ObjectFactory.java Или jaxb.index файл и package-info.java в то же пакет, где у нас есть CustomerType.java.

package org.irctc.service; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlRootElement("Customer") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "CustomerType", propOrder = { 
    "name", 
    "src", 
    "dest", 
    "price" 
}) 
public class CustomerType { 

    @XmlElement(required = true) 
    protected String name; 
    @XmlElement(required = true) 
    protected String src; 
    @XmlElement(required = true) 
    protected String dest; 
    protected Float price; 

    public String getName() { 
     return name; 
    } 
    public void setName(String value) { 
     this.name = value; 
    } 
    public String getSrc() { 
     return src; 
    } 
    public void setSrc(String value) { 
     this.src = value; 
    } 
    public String getDest() { 
     return dest; 
    } 
    public void setDest(String value) { 
     this.dest = value; 
    } 
    public Float getPrice() { 
     return price; 
    } 
    public void setPrice(Float value) { 
     this.price = value; 
    } 
} 

Использование ниже команды

D:\>schemagen org.irctc.service.CustomerType Note: Writing D:\schema1.xsd

Приведенная выше команда создаст файл XSD. Пакет класса java будет рассматриваться как пространство имен xsd.

The above details are only for understanding marshaling and unmarshaling process using tools in Jax-B API.

For more details , check below examples

Jax-B Hello World Example

Java-XML mapping with Jax-B 2.0

Смежные вопросы