【问题标题】:JAXB and validation against parts of a schema with schemagen?JAXB 和使用 schemagen 对部分模式进行验证?
【发布时间】:2010-06-28 23:19:45
【问题描述】:

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

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

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

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

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

我之前没有使用 schemagen 的经验,很快就会开始制作这个解决方案的原型。

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

【问题讨论】:

    标签: xsd jaxb


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        xjc 工具:- Xsd to Java ClassUnmarshaling

        以下面的带有命名空间的 XSD 为例。 xjc 工具将生成 java 类以及 package-info 和 object-factory。

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

        架构工具:- Java Class to XsdMarshaling

        假设我们要使用 java 类生成 Xsd 文件,那么首先我们需要在拥有 CustomerType.java 的同一包中创建 ObjectFactory.javajaxb.index 文件和 package-info.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

        【讨论】:

          猜你喜欢
          • 2011-01-30
          • 2014-03-18
          • 1970-01-01
          • 2014-09-05
          • 2015-04-06
          • 1970-01-01
          • 1970-01-01
          • 2013-05-30
          • 2010-10-18
          相关资源
          最近更新 更多