Исключение необязательных атрибутов делает 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" />
Заполнение пустых записей с нуля может не работать. В зависимости от того, что представляет это число, ноль может привести к неожиданным результатам.
Обратите внимание, что некоторые типы (например, строка) принимают пустые значения.