Eclipse XSD 生成枚举类型的Schema的实例详解

Eclipse XSD 生成枚举类型的Schema的实例详解

前言:

因为网上关于Eclipse XSD的中文资料比较少,而且关于Eclipse XSD的范例代码也凤毛麟角,但是有的时候我们需要生成一个带枚举限定的简单类型的XSD Schema,比如下面的格式,

<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema"  targetNamespace="http://www.w3.org/2001/XMLSchema">
   <complexType name="StudentType">
    <sequence>
     <element maxOccurs="1" minOccurs="1" name="username" type="string"/>
     <element maxOccurs="1" minOccurs="1" name="password" type="string"/>
     <element maxOccurs="1" minOccurs="1" name="alignment" type="AlignmentType"/>
    </sequence>
   </complexType>
   <simpleType name="AlignmentType">
    <restriction base="string">
     <enumeration value="RIGHT"/>
     <enumeration value="MIDDLE"/>
     <enumeration value="LEFT"/>
    </restriction>
   </simpleType>
   <element name="Student" type="StudentType"/>
  </schema>

其中, <SimpleType name="AlignmentType"> 代表的就是一个带枚举限定的简单类型。那么应该如何生成呢?请见参考下面的代码。

import org.eclipse.xsd.XSDComplexTypeDefinition;
import org.eclipse.xsd.XSDCompositor;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDEnumerationFacet;
import org.eclipse.xsd.XSDFactory;
import org.eclipse.xsd.XSDImport;
import org.eclipse.xsd.XSDInclude;
import org.eclipse.xsd.XSDModelGroup;
import org.eclipse.xsd.XSDParticle;
import org.eclipse.xsd.XSDRedefine;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.XSDSchemaDirective;
import org.eclipse.xsd.XSDSimpleTypeDefinition;
import org.eclipse.xsd.util.XSDResourceImpl;
import org.eclipse.xsd.util.XSDUtil;
import org.junit.Test;
import org.w3c.dom.Element; 

public class EnumFacetTest {
  protected static XSDFactory xsdFactory = XSDFactory.eINSTANCE;
  private void createAligementElement(XSDSimpleTypeDefinition aligmentType){
  String[] cellAligements={"RIGHT","MIDDLE","LEFT"};
   for(int i=0;i<cellAligements.length;i++){
     XSDEnumerationFacet alEnum=XSDFactory.eINSTANCE.createXSDEnumerationFacet();
     alEnum.setLexicalValue(cellAligements[i]);
     //aligmentType.getFacets().add(alEnum);
     aligmentType.getFacetContents().add(alEnum);
   }
  }
  /**
  <?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema"  targetNamespace="http://www.w3.org/2001/XMLSchema">
   <complexType name="StudentType">
    <sequence>
     <element maxOccurs="1" minOccurs="1" name="username" type="string"/>
     <element maxOccurs="1" minOccurs="1" name="password" type="string"/>
     <element maxOccurs="1" minOccurs="1" name="alignment" type="AlignmentType"/>
    </sequence>
   </complexType>
   <simpleType name="AlignmentType">
    <restriction base="string">
     <enumeration value="RIGHT"/>
     <enumeration value="MIDDLE"/>
     <enumeration value="LEFT"/>
    </restriction>
   </simpleType>
   <element name="Student" type="StudentType"/>
  </schema>
  */
  @Test
  public void EnumFacetTest() {
    String targeNameSpace="http://www.w3.org/2001/XMLSchema";
    XSDSchema xsdSchema=xsdFactory.createXSDSchema();
    xsdSchema.setTargetNamespace(targeNameSpace);
    xsdSchema.getQNamePrefixToNamespaceMap().put(null, "http://www.w3.org/2001/XMLSchema"); 

    //1.1 Create Complex type:student
    XSDComplexTypeDefinition complexTypeDef = xsdFactory.createXSDComplexTypeDefinition();
    complexTypeDef.setTargetNamespace(xsdSchema.getTargetNamespace());
    complexTypeDef.setName("StudentType"); 

    XSDParticle xsdParticle=xsdFactory.createXSDParticle();
    XSDModelGroup xsdModuleGroup=xsdFactory.createXSDModelGroup();
    xsdModuleGroup.setCompositor(XSDCompositor.SEQUENCE_LITERAL); 

    xsdParticle.setContent(xsdModuleGroup); 

    complexTypeDef.setContent(xsdParticle);
    complexTypeDef.setContentType(xsdParticle);
    xsdSchema.getContents().add(complexTypeDef); 

    //1.2 Add element for complex type
    //1.2.1 username element
    XSDParticle localXSDParticle = xsdFactory.createXSDParticle();
    localXSDParticle.setMinOccurs(1);
    localXSDParticle.setMaxOccurs(1);
    XSDElementDeclaration localXSDElementDeclaration = xsdFactory.createXSDElementDeclaration();
    localXSDElementDeclaration.setTargetNamespace(targeNameSpace);
    localXSDElementDeclaration.setName("username");
    XSDSchema localXSDSchema = XSDUtil.getSchemaForSchema("http://www.w3.org/2001/XMLSchema");
    XSDSimpleTypeDefinition localSimpleType=localXSDSchema.resolveSimpleTypeDefinition("string");
    localXSDElementDeclaration.setTypeDefinition(localSimpleType);
    localXSDParticle.setContent(localXSDElementDeclaration);
    xsdModuleGroup.getContents().add(localXSDParticle); 

    //1.2.2 password element
    localXSDParticle = xsdFactory.createXSDParticle();
    localXSDParticle.setMinOccurs(1);
    localXSDParticle.setMaxOccurs(1);
    localXSDElementDeclaration = xsdFactory.createXSDElementDeclaration();
    localXSDElementDeclaration.setTargetNamespace(targeNameSpace);
    localXSDElementDeclaration.setName("password");
    localXSDSchema = XSDUtil.getSchemaForSchema("http://www.w3.org/2001/XMLSchema");
    localSimpleType=localXSDSchema.resolveSimpleTypeDefinition("string");
    localXSDElementDeclaration.setTypeDefinition(localSimpleType);
    localXSDParticle.setContent(localXSDElementDeclaration);
    xsdModuleGroup.getContents().add(localXSDParticle); 

    //1.2.3.1 Create Simple Type with XSDEnumerationFacet---------------
     XSDSimpleTypeDefinition xsdSimpleTypeDefinition = XSDFactory.eINSTANCE.createXSDSimpleTypeDefinition();
     XSDSimpleTypeDefinition baseTypeDefinition = xsdSchema.resolveSimpleTypeDefinitionURI("string");
     xsdSimpleTypeDefinition.setBaseTypeDefinition(baseTypeDefinition);
     xsdSimpleTypeDefinition.setName("AlignmentType");
     createAligementElement(xsdSimpleTypeDefinition);
     xsdSchema.getContents().add(xsdSimpleTypeDefinition);
    //1.2.3.2 Create element with Simple Type --------------
     localXSDParticle = xsdFactory.createXSDParticle();
     localXSDParticle.setMinOccurs(1);
     localXSDParticle.setMaxOccurs(1);
     localXSDElementDeclaration = xsdFactory.createXSDElementDeclaration();
     localXSDElementDeclaration.setTargetNamespace(targeNameSpace);
     localXSDElementDeclaration.setName("alignment");
     localXSDSchema = XSDUtil.getSchemaForSchema("http://www.w3.org/2001/XMLSchema");
     localXSDElementDeclaration.setTypeDefinition(xsdSimpleTypeDefinition);
     localXSDParticle.setContent(localXSDElementDeclaration);
     xsdModuleGroup.getContents().add(localXSDParticle); 

    //2.Create XSDElementDeclaration and attached complex type to XSD element
    XSDElementDeclaration xsdEelement=xsdFactory.createXSDElementDeclaration();
    xsdEelement.setName("Student");
    xsdEelement.setTypeDefinition(complexTypeDef);
    xsdSchema.getContents().add(xsdEelement); 

    //3.Print Schema
    SchemaPrintService.printSchema(xsdSchema); 

  }
} 

class SchemaPrintService {
  /**
   * print schema to console
   *
   * @param xsdSchema
   */
  public static void printSchema(XSDSchema xsdSchema) {
    System.out.println("<!-- ===== Schema Composition =====");
    printDirectives(" ", xsdSchema);
    System.out.println("-->"); 

    System.out
        .println("<!-- [ " + xsdSchema.getSchemaLocation() + " ] -->");
    xsdSchema.updateElement();
    Element element = xsdSchema.getElement();
    if (element != null) {
      // Print the serialization of the model.
      XSDResourceImpl.serialize(System.out, element);
    }
  } 

  private static void printSchemaStart(XSDSchema xsdSchema) {
    System.out.print("<schema targetNamespace=\"");
    if (xsdSchema.getTargetNamespace() != null) {
      System.out.print(xsdSchema.getTargetNamespace());
    }
    System.out.print("\" schemaLocation=\"");
    if (xsdSchema.getSchemaLocation() != null) {
      System.out.print(xsdSchema.getSchemaLocation());
    }
    System.out.print("\">");
  } 

  private static void printDirectives(String indent, XSDSchema xsdSchema) {
    System.out.print(indent);
    printSchemaStart(xsdSchema);
    System.out.println(); 

    if (!xsdSchema.getReferencingDirectives().isEmpty()) {
      System.out.println(indent + " <referencingDirectives>");
      for (XSDSchemaDirective xsdSchemaDirective : xsdSchema
          .getReferencingDirectives()) {
        XSDSchema referencingSchema = xsdSchemaDirective.getSchema();
        System.out.print(indent + "  ");
        printSchemaStart(referencingSchema);
        System.out.println();
        System.out.print(indent + "   ");
        if (xsdSchemaDirective instanceof XSDImport) {
          XSDImport xsdImport = (XSDImport) xsdSchemaDirective;
          System.out.print("<import namespace=\"");
          if (xsdImport.getNamespace() != null) {
            System.out.print(xsdImport.getNamespace());
          }
          System.out.print("\" schemaLocation=\"");
        } else if (xsdSchemaDirective instanceof XSDRedefine) {
          System.out.print("<redefine schemaLocation=\"");
        } else if (xsdSchemaDirective instanceof XSDInclude) {
          System.out.print("<include schemaLocation=\"");
        }
        if (xsdSchemaDirective.getSchemaLocation() != null) {
          System.out.print(xsdSchemaDirective.getSchemaLocation());
        }
        System.out.println("\"/>");
        System.out.println(indent + "  </schema>");
      }
      System.out.println(indent + " </referencingDirectives>");
    } 

    if (!xsdSchema.getIncorporatedVersions().isEmpty()) {
      System.out.println(indent + " <incorporatedVersions>");
      for (XSDSchema incorporatedVersion : xsdSchema
          .getIncorporatedVersions()) {
        printDirectives(indent + "  ", incorporatedVersion);
      }
      System.out.println(indent + " </incorporatedVersions>");
    } 

    System.out.println(indent + "</schema>");
  } 

}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • tomcat相关配置与eclipse集成_动力节点Java学院整理

    tomcat相关配置与eclipse集成 tomcat是目前比较流行的开源且免费的Web应用服务器,首先要明确一点,Tomcat与Java密切相关,因此安装使用之前要先安装JDK并设置JDK的环境变量,由于机子上已经安装好了JDK,也设置好了JDK环境变量,因此这里不再过多叙述,只说明我设置好的环境变量: JAVA_HOME:F:\JDK_Kit CLASSPATH:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(最前面有一个点) 在pat

  • Eclipse内置浏览器打开方法

    eclipse 系统内部自带了浏览器,打开步骤如下: (1)点击工具栏Window 菜单并选择 Show View: (2)选择 show view > other: (3)在弹出来的对话框的搜索栏中输入 "browser": (4)在树形菜单中选择 "Internal Web Browser" 并点击 OK. (5)在内置浏览器中我们在地址栏中输入网址,如:http://www.jb51.net/,即可打开网页. 总结 以上就是打开eclipse内置浏览器的

  • Eclipse配置springIDE插件的方法步骤

    开始是在Eclipse中在线安装springIDE插件,结果装了好几次都是中途失败,原因是该插件中有几个jar太大,在线安装回失败,后来是先把插件下载下来,然后进行安装,终于成功了. 安装步骤: 1.下载插件,地址:http://spring.io/tools/sts/all 2.选择Eclipse中help中的Install New Software,然后选择add,然后选择Archive,在本地找到事先下载好的文件. 3.选择文件中的四个IDE文件,如图: 4.将自动更新选项勾选掉: 5.然

  • Eclipse查看开发包jar里源代码的方法

    Eclipse查看开发包jar里源代码的方法 前言: 最近我打算学习一下谷歌的类库Guava,下载了Guava-r09.jar包及其源码,为了可以方面的看其源码,我将其源码导入,下面是导入的方法: 我用的是eclipse, 在Eclipse查看开发包jar源码的方法如下: 1.选择项目,右键中单击[Properties] 2.[Java Build Path]-[Configure Build Path]-[Libraries],在下面找到如:Guava-r09.jar包,展开它,选择[Sour

  • myeclipse开发servlet_动力节点Java学院整理

    在web.xml中可以对同一个Servlet配置多个对外访问路径,并如果在web.xml中配置的信息服务器会自动加载部署,而如果是在Servlet中进行程序代码的修改,则每次都要重新部署. 首先,在使用MyEclipse创建Servlet后,会根据所创建的Servlet进行到web.xml文件的映射,如下图所示: 经过这个映射之后,在web.xml文件中就自动生成了这个Servlet的配置信息: 当然,我们可以在web.xml文件中把这个Servlet继续添加一条对外访问路径,使得这个Servl

  • myeclipse8.5优化技巧详解

    还在为自己的配置低而抛弃MyEclipse8.5?还在为那低下的速度而苦恼吗?下面我们看看myeclipse8.5优化技巧的具体方法. 取消自动validation validation有一堆,什么xml.jsp.jsf.js等等,我们没有必要全部都去自动校验一下,只是需要的时候才会手工校验一下! 取消方法: windows–>perferences–>myeclipse–>validation 除开Manual下面的复选框全部选中之外,其他全部不选 手工验证方法: 在要验证的文件上,单

  • Eclipse XSD 生成枚举类型的Schema的实例详解

    Eclipse XSD 生成枚举类型的Schema的实例详解 前言: 因为网上关于Eclipse XSD的中文资料比较少,而且关于Eclipse XSD的范例代码也凤毛麟角,但是有的时候我们需要生成一个带枚举限定的简单类型的XSD Schema,比如下面的格式, <?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema&quo

  • C++ 中类对象类型的转化的实例详解

    C++ 中类对象类型的转化的实例详解 前言: 存在继承关系的类的对象之间可以进行转化: 子类对象类型可以转化为父类类型, 例如,一个函数的参数是父类对象,而传递进来的参数是子类对象,那么子类对象类型自动转化父类对象: 但是父类对象不能转为子类对象. 代码: # include <iostream> using namespace std; class A { public: void printm() { cout<<"A::print()"<<en

  • TS 中的类型推断与放宽实例详解

    目录 简介 类型推断与放宽概念 常规类型推断 最佳通用类型 按上下文归类 类型放宽 常规类型放宽 非严格类型检查模式 严格类型检查模式 字面量类型放宽 对象.数组字面量类型的放宽 类字面量类型的放宽 函数返回值字面量类型的放宽 TS 内部类型放宽规则 实例分析 开篇问题解答 简介 我们知道在编码时即使不标注变量类型,TypeScript 编译器也能推断出变量类型,那 TypeScript 编译器是怎么进行类型推断,在类型推断时又是如何判断兼容性的呢? 此文,正好为你解开这个疑惑的,掌握本文讲解的

  • C#如何给枚举类型增加一个描述特性详解

    前言 相信很多人对枚举并不陌生,枚举可以很方便和直观的管理一组特定值.如果我们在页面上直接输出我们希望匹配的汉语意思或则其他满足我们需求的语句就更好了,当然,通常小伙伴们都会再页面上if(enum==1) "我是一个枚举"或者switch(enum)这种方式解决. 枚举的优点: <1>枚举可以使代码更易于维护,有助于确保给变量指定合法的.期望的值. <2>枚举使代码更清晰,允许用描述性的名称表示整数值,而不是用含义模糊的数来表示. <3>枚举使代码更

  • Python qrcode 生成一个二维码的实例详解

    借助第三方库qrcode实现. 二维码图片生成借助pillow qrcode的安装 在命令行中输入 pip install qrcode[pil] 用法: 1.在命令行中输入 qr "Some text" > test.png 2.在python中输入 import qrcode img = qrcode.make('Some data here') 高级用法: 使用QRCode类 import qrcode qr = qrcode.QRCode( version=1, erro

  • TypeScript基本类型之typeof和keyof详解

    目录 编译并运行 TS 代码 TypeScript基础 数组类型   [] 联合类型  | 类型别名 函数类型 void类型 可选参数 ? 参数默认值= 对象类型 :object interface 元组类型 类型推论 类型断言  as 或者 <>泛型 typeof keyof any和unknow的区别 函数重载 总结 安装编译ts的工具 安装命令:npm i -g typescript 或者 yarn global add typescript. 验证是否安装成功:tsc –v(查看 Ty

  • php 生成加密公钥加密私钥实例详解

    php 生成加密公钥加密私钥实例详解 生成公钥私钥     win下必须要openssl.cof支持   liunx一般已自带安装  $config = array( //"digest_alg" => "sha512", "private_key_bits" => 512, //字节数 512 1024 2048 4096 等 "private_key_type" => OPENSSL_KEYTYPE_RS

  • C语言中枚举与指针的实例详解

     C语言中枚举与指针的实例详解 总结一下, 定义枚举,用typedef enum关键字, 比如 typedef enum{Red,Green,Blue} Color3; 枚举到数值的转换,如果没有指定代表数值就是从0开始算, 比如 Color3 c=Red; printf("%d",c);会显示0, 除非指定 如typedef enum{Red=3,Green=5,Blue=10} Color3; 关于类型指针的定义, 定义的时候在变量名左边加*代表此变量只是一个空指针而已, 若需要赋

  • Java 生成随机字符串数组的实例详解

    Java 生成随机字符串数组的实例详解 利用Collections.sort()方法对泛型为String的List 进行排序.具体要求: 1.创建完List<String>之后,往其中添加十条随机字符串 2.每条字符串的长度为10以内的随机整数 3.每条字符串的每个字符都为随机生成的字符,字符可以重叠 4.每条随机字符串不可重复 将涉及到的知识有: String.StringBuffer.ListArray.泛型.Collections.sort.foreach.Random等相关知识,算是

  • java枚举类的构造函数实例详解

    java枚举类的构造函数实例详解 首先,给出一个例题如下: enum AccountType { SAVING, FIXED, CURRENT; private AccountType() { System.out.println("It is a account type"); } } class EnumOne { public static void main(String[]args) { System.out.println(AccountType.FIXED); } } T

随机推荐