[置顶] 使用org.eclipse.xsd.XSDEnumerationFacet生成枚举类型的Schema

标签: schemaeclipsecreateXSDEnumerationXSDEnumerationFacetXSDSchema
1345人阅读 评论(0) 收藏 举报
分类:

因为网上关于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>");
	}

}




1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:384531次
    • 积分:6321
    • 等级:
    • 排名:第4065名
    • 原创:227篇
    • 转载:0篇
    • 译文:5篇
    • 评论:157条
    博客专栏