排除可选属性会使gml对xsd架构无效

时间:2014-07-30 21:49:58

标签: xml xsd validation xsd-validation

我有xsd Schema,以及根据该架构的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>

部分&#34;无效&#34; 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>

修改

部分模式中缺少的元素继承自其他功能(base =&#34; fgu:KatastarskiGeoObjektType&#34;)。

1 个答案:

答案 0 :(得分:2)

这是一个纯粹基于XML的答案,因为它似乎使用的是非地理标记语言(GML)架构。如果您使用过GML架构,我不确定这个答案是否适用。

在XML中,数字不能留空。 sluzbena_Povrsina(positiveInteger)和povrsina(double)都是数字,因此以下语法将始终无效:<fgu:povrsina></fgu:povrsina> 使用nillable="true"将这些元素标记为nillable要求实例文档使用以下语法显式声明元素为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" />

填写零空白条目可能无效。根据此数字所代表的含义,零可能会导致意外结果。

请注意,某些类型(例如字符串)确实接受空值。