繁体   English   中英

从元模型中消除可选字段

[英]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 ,并在需要时引用它。

然后,添加其他类型(例如ScalarTypeVectorTypeMatrixType ),这些类型扩展ValueType并声明全局元素scalarvectormatrix并带有MatrixType substitutionGroup="tns:value" 这将意味着这些元素可以替代value

在您的MeasureType您将仅包含<xs:element ref="value"/> ,这将允许scalarvectormatrix出现。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM