我在根据xsd架构验证xml文件时遇到问题,xmllint:xmllint compains的有效性错误是,虽然在xsd架构中定义了这样的<foobar/>,但不需要像foobar这样的标记:

<xs:element name="foobar" minOccurs="0">
    <xs:simpleType>
        <xs:restriction base="xs:positiveInteger">
            <xs:minInclusive value="1"/>
            <xs:maxInclusive value="9999"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

供比较:
<foobar>123</foobar>根据xmllint是有效的。xmllint也不会抱怨,如果我从xml文件中完全去掉这个foobar标记。
问题:
那么,否认<foobar/>有什么意义?
谢谢!
备注:实际错误信息:
myfile.xml:135298: element foobar: Schemas validity error : Element '{http://www.foobaz.com/namespace}foobar': '' is not a valid value of the local atomic type.

P.P.S.:xmllint版本20901

最佳答案

您在架构中说过,元素的值必须是1到9999之间的整数,但元素的实际值是空内容。我不太明白为什么您的模式不允许这个值。
如果要允许此范围内的整数或空内容,有两种可能的方法:
(a)定义一个联合类型,其成员类型是(i)1到9999范围内的整数,和(ii)一个facetlength=0的字符串,或
(b)定义一个列表类型,其项类型是1到9999范围内的整数,列表类型具有minLength=0maxLength=1
你也可以使用nillable="true"但是<foobar/>不是有效的内容,它必须是<foobar xsi:nil="true"/>这(在我看来)完全违背了目的。

关于xml - 使用xmllint进行XML模式验证:提示<foobar/>之类的空标签,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35768997/

10-12 12:44
查看更多