欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-26 08:00:45
eclipse xsd 生成枚举类型的schema的实例详解 前言: 因为网上关于eclipse xsd的中文资料比较少,而且关于eclipse xsd的范例代码也凤毛...

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

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

相关标签: Eclipse XSD