Shun 发表于 2021-10-20 14:47:56

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

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

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

https://www.uoften.com/program/jsp/20180413/48257.html
页: [1]
查看完整版本: Eclipse XSD 生成枚举类型的Schema的实例详解