Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xsd JAXB和使用schemagen对部分模式进行验证?_Xsd_Jaxb - Fatal编程技术网

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

Xsd JAXB和使用schemagen对部分模式进行验证?,xsd,jaxb,Xsd,Jaxb,非常概括和简化的场景描述: 应用程序通过UI构建JAXB实例 JAXB实例是分不同步骤构建的,最后是组合的 完成此操作后,我必须针对XSD对每个步骤中创建的JAXB实例进行验证,以验证UI层没有构建无意义的内容 现在模式定义了复杂类型A,B和C。模式指定XML文档必须有顶层元素A,这可以包含多个B,这可以选择包括C。我为B创建JAXB实例,并绝对希望在将其嵌套到A下之前根据XSD中的复杂类型定义进行验证。但是,如果根据整个XSD 问题:如何仅针对XSD的一部分验证JAXB实例,该XSD的类是

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

  • 应用程序通过UI构建JAXB实例
  • JAXB实例是分不同步骤构建的,最后是组合的
  • 完成此操作后,我必须针对XSD对每个步骤中创建的JAXB实例进行验证,以验证UI层没有构建无意义的内容
现在模式定义了复杂类型A,B和C。模式指定XML文档必须有顶层元素A,这可以包含多个B,这可以选择包括C。我为B创建JAXB实例,并绝对希望在将其嵌套到A下之前根据XSD中的复杂类型定义进行验证。但是,如果根据整个XSD

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

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

我以前没有使用schemagen的经验,不久将开始此解决方案的原型设计


注意:在现实中,模式并不像上面的示例中那样简单,创建一些始终有效的模拟的解决方案是不可行的。更不用说这种验证至少要在上百个地方进行。

事实证明,使用xsi:type就可以实现这一点


为要验证的元素创建单独的架构,其中该元素位于根级别。
为了解决丢失的@ XMLROOTTAG,请参阅

> P>在使用<代码> XJC> /COD>和 StimaGue/Cuth>工具时,请考虑我们在java中使用的相同概念。在java中,每个类都是一个骨架,对象是一个实例。同样,我们需要将XSD作为骨架和XML作为实例。 xjc工具:-
Xsd到Java类
解组

例如,考虑下面带有名称空间的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:\>schemagen org.irctc.service.CustomerType
注意:写入D:\schema1.xsd

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

以上详细信息仅用于理解使用Jax-B API中的工具进行封送和解封送的过程。

有关详细信息,请查看以下示例

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;
    }
}