Jaxb for OGC Schemas

时间:2013-01-11 14:11:28

标签: java jaxb ogc

这是我的方案(scheme1.xsd)

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:app="http://www.deegree.org/app" xmlns:deegreewfs="http://www.deegree.org/wfs" xmlns:dgjdbc="http://www.deegree.org/jdbc" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:wfs="http://www.opengis.net/wfs" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.deegree.org/app">
    <xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/feature.xsd" />
    <xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/geometryAggregates.xsd" />
    <xs:import namespace="http://www.opengis.net/wfs" schemaLocation="http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" />
    <!-- CONFIGURACI N DE LA BASE DE DATOS -->
    <!-- ==============================Genera una clave como identificador======================================== -->
    <xs:element name="Entidad" substitutionGroup="gml:_Feature" type="app:EntidadType">
        <!-- DEFINICI N DE GML:ID -->
    </xs:element>
    <!-- ==============================RESOLUCION DE CAMPOS======================================== -->
    <xs:complexType name="EntidadType">
        <xs:complexContent>
            <xs:extension base="gml:AbstractFeatureType">
                <xs:sequence>
                    <!-- Campo simple - INTEGER -->
                    <xs:element name="fid" type="xs:integer">
                    </xs:element>
                    <!-- Campo simple - INTEGER -->
                    <xs:element name="nombreEntidad_nombre" type="xs:string">
                    </xs:element>
                    <xs:element name="entidadLocal_municipioReal" type="xs:string">
                    </xs:element>
                    <xs:element name="entidadLocal_municipio" type="xs:string">
                    </xs:element>
                    <xs:element name="entidadLocal_provinciaReal" type="xs:string">
                    </xs:element>
                    <xs:element name="entidadLocal_provincia" type="xs:string">
                    </xs:element>
                    <xs:element name="posicionEspacial_BBOX" type="gml:GeometryPropertyType">
                    </xs:element>
                    <xs:element name="posicionEspacial_Centroide" type="xs:string">
                    </xs:element>
                    <!-- GEOM -->
                    <xs:element name="geom" type="gml:GeometryPropertyType">
                    </xs:element>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

当我使用时:

xjc scheme1.xsd

我明白了:

parsing a schema...
[ERROR] Property "Title" is already defined. Use &lt;jaxb:property> to resolve this conflict.
line 232 of "http://www.w3.org/1999/xlink.xsd"

[ERROR] The following location is relevant to the above error
line 219 of "http://www.w3.org/1999/xlink.xsd"

[ERROR] Property "Title" is already defined. Use &lt;jaxb:property> to resolve this conflict.
line 261 of "http://www.w3.org/1999/xlink.xsd"

[ERROR] The following location is relevant to the above error
line 246 of "http://www.w3.org/1999/xlink.xsd"

Failed to parse a schema.

我使用了这个文件(binding.xjb):

<jxb:bindings version="2.0"
          xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
          xmlns:xs="http://www.w3.org/2001/XMLSchema" >

    <jxb:bindings schemaLocation="http://www.w3.org/1999/xlink.xsd" node="/xs:schema">

        <jxb:bindings node="//xs:attributeGroup[@name='locatorAttrs']">
            <jxb:bindings node=".//xs:attribute[@ref='xlink:title']">
                <jxb:property name="title1"/>
            </jxb:bindings>
        </jxb:bindings>

        <jxb:bindings node="//xs:attributeGroup[@name='arcAttrs']">           
            <jxb:bindings node=".//xs:attribute[@ref='xlink:title']">
                <jxb:property name="title2"/>
            </jxb:bindings>            
        </jxb:bindings>        

    </jxb:bindings>

</jxb:bindings>

xjc scheme1.xsd -b binding.xjb

我收到了这个错误:

parsing a schema...
compiling a schema...
[ERROR] Two declarations cause a collision in the ObjectFactory class.
  line 1466 of http://schemas.opengis.net/gml/3.1.1/base/geometryPrimitives.xsd

[ERROR] (Related to above error) This is the other declaration.   
line 1520 of "http://schemas.opengis.net/gml/3.1.1/base/geometryPrimitives.xsd"

[ERROR] Two declarations cause a collision in the ObjectFactory class.
 line 206 of "http://schemas.opengis.net/gml/3.1.1/base/defaultStyle.xsd"

[ERROR] (Related to above error) This is the other declaration.   
 line 225 of "http://schemas.opengis.net/gml/3.1.1/base/defaultStyle.xsd"

[ERROR] Two declarations cause a collision in the ObjectFactory class.
 line 287 of "http://schemas.opengis.net/gml/3.1.1/base/geometryBasic0d1d.xsd"

我做错了什么?

1 个答案:

答案 0 :(得分:2)

问题是xjc构建的ObjectFactory将包含一个工厂方法,用于包内的元素,在你的情况下:

在geometryPrimitives.xsd上,第1466行:

<element name="_Solid" type="gml:AbstractSolidType" abstract="true" ...

在第1520行:

<element name="Solid" type="gml:SolidType" substitutionGroup="gml:_Solid"/>

它们都将在ObjectFactory中创建一个名为“createSolid()”的工厂方法。要解决此问题,您可以在binding.xjb中包含以下内容:

<jxb:bindings schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/geometryPrimitives.xsd" node="/xs:schema">
    <jxb:bindings node="//xs:element[@name='_Solid']">
        <jxb:factoryMethod name="gmlAbstractSolidElementFactory" />
    </jxb:bindings>
</jxb:bindings>

如果冲突来自不同的架构文件,您可以指定每个架构所需的程序包。这样您就不必替换每个冲突的工厂方法名称的名称来节省时间:

<bindings schemaLocation="../path/to/my.xsd">
   <schemaBindings>
      <package name="org.acme.foo"/>
   </schemaBindings>
</bindings>