[英]Eliminate optional fields from meta model
我创建了一个元模型来存储技术指标,以便在用JAXB解析后用Java管理这些指标。
我想支持标量(角度,长度,温度等)以及向量(如方向)。
作为奖励,我也想支持矩阵(也许用于循环)。 下面是一个示例模型。
<measure name="X">
<properties>
<property name="description" value="length"/>
<property name="unit" value="mm"/>
<property name="tolerance" value="1"/>
</properties>
<scalar>150.157</scalar>
<vector/>
<matrix/>
</measure>
我不喜欢当前的方法,因为我为三种可能的值类型提供了三个可选条目。
是否有更好的,统一的方法而不使用也容易解析的可选字段?
方法之一是使用替换组。 您声明某个ValueType
的全局元素,例如value
,并在需要时引用它。
然后,添加其他类型(例如ScalarType
, VectorType
, MatrixType
),这些类型扩展ValueType
并声明全局元素scalar
, vector
, matrix
并带有MatrixType
substitutionGroup="tns:value"
。 这将意味着这些元素可以替代value
。
在您的MeasureType
您将仅包含<xs:element ref="value"/>
,这将允许scalar
, vector
, matrix
出现。
XJC可以编译这种模式,并且JAXB在替换组中可以很好地工作。 您ll get a
JAXBElement`类型的属性。
这是使用此方法的架构示例 :
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www.opengis.net/ogc"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="1.1.3">
<!--
filter is an OGC Standard.
Copyright (c) 2002,2003,2004,2010 Open Geospatial Consortium.
To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
Updated: 2012-07-21
-->
<xsd:element name="Add" type="ogc:BinaryOperatorType"
substitutionGroup="ogc:expression"/>
<xsd:element name="Sub" type="ogc:BinaryOperatorType"
substitutionGroup="ogc:expression"/>
<xsd:element name="Mul" type="ogc:BinaryOperatorType"
substitutionGroup="ogc:expression"/>
<xsd:element name="Div" type="ogc:BinaryOperatorType"
substitutionGroup="ogc:expression"/>
<xsd:element name="PropertyName" type="ogc:PropertyNameType"
substitutionGroup="ogc:expression"/>
<xsd:element name="Function" type="ogc:FunctionType"
substitutionGroup="ogc:expression"/>
<xsd:element name="Literal" type="ogc:LiteralType"
substitutionGroup="ogc:expression"/>
<xsd:element name="expression" type="ogc:ExpressionType" abstract="true"/>
<!-- <xsd:complexType name="ExpressionType" abstract="true" mixed="true"/>
-->
<xsd:complexType name="ExpressionType" abstract="true"/>
<xsd:complexType name="BinaryOperatorType">
<xsd:complexContent>
<xsd:extension base="ogc:ExpressionType">
<xsd:sequence>
<xsd:element ref="ogc:expression" minOccurs="2" maxOccurs="2"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="FunctionType">
<xsd:complexContent>
<xsd:extension base="ogc:ExpressionType">
<xsd:sequence>
<xsd:element ref="ogc:expression" minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="LiteralType">
<xsd:complexContent mixed="true">
<xsd:extension base="ogc:ExpressionType">
<xsd:sequence>
<xsd:any minOccurs="0"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="PropertyNameType">
<xsd:complexContent mixed="true">
<xsd:extension base="ogc:ExpressionType"/>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.