音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

Eclipse XSD 生成枚举类型的Schema的实例详解
日期:2021-09-07 15:55:20   来源:脚本之家

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

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

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    ASP编程JSP编程PHP编程.NET编程python编程