Исключение необязательных атрибутов делает gml недопустимым для схемы xsd

У меня есть схема xsd и файл gml в соответствии с этой схемой. Когда все атрибуты имеют значения (необязательные и обязательные), файл gml становится действительным для схемы. Но когда я намеренно удаляю несколько необязательных атрибутов в некоторых элементах, валидатор говорит, что gml недопустим для схемы.

Все необязательные элементы имеют атрибут nullable = "true".

Что здесь не так?

Пример:

Часть схемы:

<xsd:complexType name="ADM_DrzavaType" final="#all">
    <xsd:complexContent>
        <xsd:extension base="fgu:KatastarskiGeoObjektType">
            <xsd:sequence>
                <xsd:element name="sifra" type="fgu:CL_ADM_Drzava_Sifra"/>
                <xsd:element name="naziv" type="fgu:CL_ADM_Drzava_Naziv"/>
                <xsd:element name="sluzbena_Povrsina" type="xsd:positiveInteger" nillable="true"/>
                <xsd:element name="povrsina" type="xsd:double" nillable="true"/>
                <xsd:element name="geometrija" type="gml:MultiSurfacePropertyType"/>
            </xsd:sequence>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

Часть "недействительного" gml (sluzbena_Povrsina и povrsina пусты):

<fgu:ADM_Drzava gml:id="Drzava-234">
        <fgu:oid>1122115522125</fgu:oid>
        <fgu:transaction_Time gml:id="Drzava-234-1">
            <gml:beginPosition>20140717190255</gml:beginPosition>
            <gml:endPosition>20140717190255</gml:endPosition>
        </fgu:transaction_Time>
        <fgu:valid_Time gml:id="Drzava-234-2">
            <gml:beginPosition>20140717190255</gml:beginPosition>
            <gml:endPosition>20140717190255</gml:endPosition>
        </fgu:valid_Time>
        <fgu:lineage_Parent>1122115522124</fgu:lineage_Parent>
        <fgu:lineage_Child>1122115522127</fgu:lineage_Child>
        <fgu:napomena>asd</fgu:napomena>
        <fgu:greska>false</fgu:greska>
        <fgu:izvor_Geometrije>GNSS</fgu:izvor_Geometrije>
        <fgu:sifra>BiH</fgu:sifra>
        <fgu:naziv>Bosna i Hercegovina</fgu:naziv>
        <fgu:sluzbena_Povrsina></fgu:sluzbena_Povrsina>
        <fgu:povrsina></fgu:povrsina>
        <fgu:geometrija>
    <!-- this element is long to much, so I will omit it. -->
        </fgu:geometrija>
</fgu:ADM_Drzava>

РЕДАКТИРОВАТЬ:

Недостающие элементы в части схемы наследуются от других Feature (base="fgu:KatastarskiGeoObjektType").

1 ответ

Это чисто XML-ответ, потому что кажется, что вы используете схему языка негеографической разметки (GML). Если бы вы использовали схему GML, я не уверен, что этот ответ подойдет.

В XML числа нельзя оставлять пустыми. И sluzbena_Povrsina (positiveInteger), и povrsina (double) являются числами, поэтому следующий синтаксис всегда будет недействительным: <fgu:povrsina></fgu:povrsina> Пометить эти элементы можно с помощью nillable="true" требует, чтобы экземпляр документа явно указывал, что элемент равен nill, используя следующий синтаксис: <fgu:povrsina xsi:nill="true" />

Измените эти строки:

<fgu:sluzbena_Povrsina></fgu:sluzbena_Povrsina>
<fgu:povrsina></fgu:povrsina>

К этому:

<fgu:sluzbena_Povrsina xsi:nill="true" />
<fgu:povrsina xsi:nill="true" />

и это должно подтвердить.

****** [Другие варианты] ******

Это может быть, а может и не быть вариантом, но вы можете рассмотреть возможность удаления nillability и добавления minOccurs="0" следующим образом:

<xsd:element name="sluzbena_Povrsina" type="xsd:positiveInteger" minOccurs="0" />

Это позволит вам полностью исключить элемент из документа экземпляра, но он все равно будет недействительным, если элемент присутствует, но пустой.

Другим вариантом может быть назначение значения по умолчанию, например:

<xsd:element name="sluzbena_Povrsina" type="xsd:positiveInteger" default="0" />

Заполнение пустых записей с нуля может не работать. В зависимости от того, что представляет это число, ноль может привести к неожиданным результатам.

Обратите внимание, что некоторые типы (например, строка) принимают пустые значения.

Другие вопросы по тегам