java - 用于 OGC 模式的 Jaxb

标签 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"

我做错了什么?

最佳答案

问题是 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>

关于java - 用于 OGC 模式的 Jaxb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14279887/

相关文章:

java - 整数解码列表不正确

xml - 元素或属性与 QName 生产不匹配

java - JAXB DOM 节点解码省略元素

java - Log4J - JsonLayout 和 RollingFileAppender 生成无效的 JSON

jaxb - 配置 JAXB unmarshal tp 避免解码 XML 数据

jaxb - XmlJavaTypeAdapter 抛出用户定义的异常

xml - XSD 架构目标命名空间

java - 在 cygwin 中启动 Java 程序 (jmeter)

java - Android 应用程序无法将数据插入 MySQL DB

java - 避免返回 LIST 时可能出现的并发问题