使用org.eclipse.xsd.XSDEnumerationFacet生成枚举类型的Schema

原创 2014年12月15日 22:28:48

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

}




版权声明:本文为博主原创文章,未经博主允许不得转载。

枚举类型的使用

  • 2013年06月20日 13:10
  • 348KB
  • 下载

java枚举类型enum的使用

  • 2014年07月23日 13:57
  • 6KB
  • 下载

Spring如何加载XSD文件(org.xml.sax.SAXParseException: Failed to read schema document错误的解决方法)

本文原文连接: http://blog.csdn.net/bluishglc/article/details/7596118 ,转载请注明出处!有时候你会发现过去一直启动正常的系统,某天启动时会报出形...

XML简介Schema之XSD 杂项数据类型 VS XML总结

20.XSD 杂项数据类型(Miscellaneous Data Types) ======================================== 其他杂项数据类型包括逻辑、base...

XSD根据xml生成schema文件

  • 2017年07月18日 15:08
  • 20KB
  • 下载

打印org.eclipse.xsd.XSDSchema对象

因为网上关于Eclipse XSD的中文资料比较少,但是有的时候,我们需要使用Eclipse XSD的API去构造或者修改一个XSD文件。 那么当我们创建了org.eclipse.xsd.XSDSch...

mybatis入门实战之枚举类型

  • 2017年08月22日 01:32
  • 21KB
  • 下载

5-枚举类型、输入输出、处理

  • 2013年07月16日 15:58
  • 14KB
  • 下载

gsoap入门:Schema类型映射塈将xsd:date类型转为struct tm

typemap.dat的作用在使用wsdl2h生成.h文件时,有一个参数-t 用于指定typemap.dat,如果你不指定这个参数,wsdl2h也能正常执行,后续soapcpp2也能正常生成c/c++...
  • 10km
  • 10km
  • 2016年08月20日 12:17
  • 790
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用org.eclipse.xsd.XSDEnumerationFacet生成枚举类型的Schema
举报原因:
原因补充:

(最多只允许输入30个字)