JAXB和使用schemagen对模式的部分进行验证?

时间:2010-06-28 23:19:46

标签: xsd jaxb

非常概括和简化的场景描述:

  • 应用程序通过UI
  • 构建JAXB实例
  • JAXB实例构建在最后组成的不同步骤中,
  • 完成后,我必须针对XSD执行在每个步骤中创建的JAXB实例的验证,以验证UI层不构建废话。

现在,模式定义了复杂的类型A,B和C.模式指定XML文档必须具有顶级元素A,并且这可以包含多个B,并且可以选择包含C.我为B创建JAXB实例并且绝对想要在将其嵌套到A之前,对XSD中的复杂类型定义进行验证。但是,如果我对整个XSD进行验证,则验证此操作将失败。

问题:如何仅针对从中生成其类的XSD的一部分验证JAXB实例?

如何使用schemagen从JAXB类生成模式,我要验证哪个实例,然后对其进行验证?你认为那可行吗?还有其他想法吗?

我以前没有使用schemagen的经验,很快就会开始对这个解决方案进行原型设计。

注意:实际上,模式并不像上面的例子那么简单,并且创建一些总是有效的模拟A的解决方案不可行。更不用说这种验证至少可以说是百位。

3 个答案:

答案 0 :(得分:1)

为要验证的元素创建单独的架构,此元素位于根级别。 解决方法缺少@xmlRoottag,请参阅101 ways to marshal objects with JAXB

答案 1 :(得分:0)

事实证明,使用xsi:type让我们完成这个。

http://www.w3.org/TR/xmlschema-1/#xsi_type

答案 2 :(得分:0)

在使用isPrefLabel()xjc工具时,请考虑我们在java中使用的相同概念。在java中,每个类都是一个骨架,而对象是一个实例。我们需要将XSD视为骨架,将XML视为实例。

  

xjc工具: - schemagenXsd to Java Class

例如,考虑以下带有名称空间的XSD。 Unmarshaling工具将生成java类以及package-info和object-factory。

xjc

使用以下命令

<?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>

注意: - 如果您有多个java类,则可以使用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文件而不是jaxb.index

  

schemagen工具: - ObjectFactory.javaJava Class to Xsd

让我们假设我们想要使用java类生成Xsd文件然后首先我们需要在我们拥有{的同一个包中创建MarshalingObjectFactory.java文件和jaxb.index {1}}。

package-info.java

使用以下命令

CustomerType.java

上面的命令将生成xsd文件。 java类的包将被视为xsd名称空间。

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

Jax-B Hello World Example

Java-XML mapping with Jax-B 2.0