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

}

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

时间: 2017-09-27

Eclipse内置浏览器打开方法

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

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

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

myeclipse8.5优化技巧详解

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

Eclipse配置springIDE插件的方法步骤

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

PyCharm配置mongo插件的方法

一.安装mongo plugs插件 File->Setting Plugins查询Mongo选择Search in repositories 选择Mongo plugins,选择install 然后重启pycharm,Restart PyCharm就完成了mongo插件的安转 2.配置mongo插件 选择View->ToolButton 在pycharm的右边可以看到,选择扳手标志 选择绿色加号按钮出现Add a mongo server,输入label即可,也可设置用户名和密码: 选择ok后

java配置数据库连接池的方法步骤

先来了解下什么是数据库连接池数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接,可以克服上述缺点,极大地节省系统资源和时间. 在实际应用开发中,特别是在WEB应用系统中,如果JSP.Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接.打开数据库.存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时

eclipse下配置Spring环境的方法步骤

工具: jdk1.8 win10 spring5.0 1.准备工作:下载Spring开发应用的插件,api 1.spring插件包:springsource-tool-suite-3.9.4.RELEASE-e4.8.0-updatesite.zip 2.logging日志api文件:commons-logging-1.2-bin.zip,然后解压 3.Spring-framework开发的api:spring-framework-5.0.5.RELEASE-dist.zip,然后解压 2. 安

Pycharm配置远程调试的方法步骤

动机 一些bug由于本地环境和线上环境的不一致可能导致本地无法复现 本地依赖和线上依赖版本不一致也可以导致一些问题 有时一些bug跟数据相关,本地数据无法和线上数据一致 有些三方平台会验证服务器的合法性或者异步回调结果,如微信支付,这时候本地无法测试 如上所诉,要是有一个很方便调试远程服务器的方法,岂不美哉.通过PyCharm我们可以很方便地实现远程调试,下面详细介绍下PyCharm这个牛叉的功能. 使用远程解释器 默认情况下我们在本地开发Python程序时,使用的是本地的Python解释器,如

CentOS下编译安装nginx及配置缩略图插件的方法教程

相信大家都知道利用yum安装nginx 非常方便,但是有些插件并不会默认安装,比如 http_image_filter_module, 因此我们需要编译安装 nginx,已达到我们的目的.下面来看看详细的方法吧. 安装依赖 yum install -y pcre-devel libmxl2-devel libxslt-devel gd-devel 安装 nginx wget http://nginx.org/download/nginx-1.9.1.tar.gz tar -xzvf nginx-

PhpStorm配置Xdebug调试的方法步骤

安装xdebug 去官网下载对应版本的xdebug扩展 XDEBUG EXTENSION FOR PHP | DOWNLOADS 如何选择正确版本输出phpinfo()函数的内容 查看输出页面的网页源码 全选复制 到这个页面XDEBUG EXTENSION FOR PHP | DOCUMENTATION | INSTALLATION,将刚才复制的内容拷贝进去,并分析 可以得到自己当前版本的php对应哪一个xdebug文件 安装扩展 这个windows系统和Linux系统是不一样的(网上很多,不细

idea 离线安装lombok插件的方法步骤(图文)

Lombok简介 Lombok是Java语言的实用工具,确切的说,应该说是一个很好用的插件,对,插件!可以用来帮助开发人员消除Java代码的冗长,尤其是对于简单的Java对象(POJO),它通过注解实现这一目的,而不是一大段一大段的Java方法. Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free,

babel7.x和webpack4.x配置vue项目的方法步骤

很偶然的今天想开个自己的小项目,记录一下最近项目工程上实现的一个小交互.按照之前运行非常流畅的配置走一遍,打包遇到各种坑.只好根据命令行的报错逐个排查,发现babel升级了一个大版本,已经到7.x了.看来每日沉迷项目,已经跟不上节奏了.这里记录一下遇到的问题以及解决方案. 1.webpack 4.x 插件 extract-text-webpack-plugin (node:2628) DeprecationWarning: Tapable.plugin is deprecated. Use ne

.NET Core配置多环境的方法步骤

配置多环境是日常开发经常需要用到的操作,实现多环境配置后可以规避生产测试环境混合带来的麻烦和风险,减少项目风险,并且也可以通过多环境来保证生产环境上密钥的安全. 我之前在做iOS开发时,iOS的解决方法是通过多个Target配置不同的环境变量,并且配合宏来实现不同的环境启动时,读取不同的配置,在.NET Core中当然也会有类似的这种方式,并且它比iOS中更简单,只需要注入不同的环境变量即可,而iOS还需要建立多个Target才能实现注入不同的环境变量,.NET Core则可以直接在启动时注入不