0

考虑这个简单的 KML 示例,它通过<ExtendedData><Schema>元素合并了类型化的自定义数据:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Document>
    <name>KML does not validate when an 'unsignedInt' field is zero</name>
    <ExtendedData>
      <SchemaData schemaUrl="#DocumentSchemaId">
        <SimpleData name="UNSIGNED_INT">0</SimpleData>
      </SchemaData>
    </ExtendedData>
    <Schema id="DocumentSchemaId" name="doc">
      <SimpleField name="UNSIGNED_INT" type="xsd:unsignedInt">
        <displayName>Unsigned Int</displayName>
      </SimpleField>
    </Schema>
  </Document>
</kml>

在这种情况下,只kml:SimpleData定义了一个字段。它的名称是UNSIGNED_INT,分配的类型是xsd:unsignedInt

问题是这个文档没有通过这个有信誉的KML 验证器进行验证。验证器返回的错误是:

"kml:SchemaData contains a kml:SimpleData value that does not
correspond to the declared type."

验证器指示此错误的原因是因为感兴趣的字段已被分配一个值0

<SimpleData name="UNSIGNED_INT">0</SimpleData>

但是,当值更改为非零无符号整数时,文档验证(如预期的那样):

<SimpleData name="UNSIGNED_INT">42</SimpleData>

我的问题是,为什么这个验证器标记0为不符合xsd:unsignedInt类型的约束?

KML 验证器的处理方式0XML 模式标准必须说明的内容相冲突:xsd:unsignedIntxsd:unsignedInt

unsignedInt具有由十进制数字的有限长度序列 (#x30-#x39) 组成的词法表示。例如:0、1267896754、100000

最后,作为参考,这里列出了所有定义用于 的数据类型kml:SimpleField

  • xsd:字符串
  • xsd:int
  • xsd:unsignedInt
  • xsd:短
  • xsd:unsignedShort
  • xsd:浮动
  • xsd:双
  • xsd:布尔值

(来自KML 验证器文档OGC KML 2.2 标准,子条款 9.9.4.2.1。)

4

1 回答 1

1

这似乎是 kmlvalidator 的一个错误,我会向他们报告。我使用 Oxygen XML Editor 测试了正常的模式验证,并得到了验证。

于 2012-08-30T19:00:47.313 回答