评论

收藏

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

开发技术 开发技术 发布于:2021-10-20 14:47 | 阅读数:569 | 评论:0

Eclipse XSD 生成枚举类型的Schema的实例详解
前言:
因为网上关于Eclipse XSD的中文资料比较少,而且关于Eclipse XSD的范例代码也凤毛麟角,但是有的时候我们需要生成一个带枚举限定的简单类型的XSD Schema,比如下面的格式,
<?xml version="1.0" encoding="UTF-8"?><schema xmlns="https://www.w3.org/2001/XMLSchema"  targetNamespace="https://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="https://www.w3.org/2001/XMLSchema"  targetNamespace="https://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="https://www.w3.org/2001/XMLSchema"; 
  XSDSchema xsdSchema=xsdFactory.createXSDSchema(); 
  xsdSchema.setTargetNamespace(targeNameSpace); 
  xsdSchema.getQNamePrefixToNamespaceMap().put(null, "https://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("https://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("https://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("https://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>"); 
  } 
 
}
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

关注下面的标签,发现更多相似文章