XSD:验证xsi:nil元素不起作用

时间:2018-07-06 19:11:52

标签: xml validation xsd null

此问题询问有关以XML表示NULL的正确方法: What is the correct way to represent null XML elements?

可接受的答案似乎是提供属性xsi:nil =“ true”是显式提供空内容的最佳方法。

另一个问题是关于本教程的,有关如何在XSD中声明一个nilable元素并提供一个元素:

http://www.zvon.org/xxl/XMLSchemaTutorial/Output/ser_over_st0.html

鉴于该信息,我相信我正在遵循准则,但是我的XSD验证失败。这是一个非常简单的XML,第二个子元素为nil

<?xml version="1.0"?>
<plant xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
    <genus>GenusValue</genus>
    <species xsi:nil="true" />
</plant>

这是我认为应该验证的XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="plant">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="genus">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:maxLength value="60"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
                <xs:element name="species" nillable="true">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:maxLength value="60"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>   
</xs:schema>

ColdFusion2016(XmlValidate())中的验证功能失败(并没有非常有用的错误消息)。 Notepad ++(具有已安装的XML验证工具)也将通过验证失败,并显示错误消息:

Validation of current file using XML schema:

ERROR: Element 'species', attribute '{https://www.w3.org/2001/XMLSchema-instance}nil': The attribute '{https://www.w3.org/2001/XMLSchema-instance}nil' is not allowed.

生成XML的代码不在我的控制之下。我已经弄清楚了如何验证:

<species></species>

但这是一个不同的问题-这不是当前提供XML的方式。 (因此,除非使用如上所述的验证标签,否则有关具有空字符串,minOccurs等的并集的解决方案将无济于事。)

也许我只是缺少或误解了有关XSD的某些信息? (这似乎也遵循此处给出的文档:https://www.w3schools.com/xml/el_element.asp,尽管它们实际上并未显示提供xsi:nil =“ true”值的XML。)

zvon示例正在将一个具有子对象的标签设置为nillable,而我尝试设置为nillable的标签是其他东西的孩子,并且本身没有子元素,但是似乎我仍在关注的功能部分zvon示例演示了什么?

帮助?!? ;)

谢谢。

1 个答案:

答案 0 :(得分:1)

至少有三种常见的方式来表示XML中的缺失值:

(a)完全省略元素  (b)包含元素,但将其内容留空  (c)包含元素,将其内容留空,并添加属性xsi:nil =“ true”

这些都不是普遍优于其他。就个人而言,我通常会发现(a)最方便,但其他人可能会不同意。有人会认为您需要区分不同类型的空值:(a)已知一个人没有中间名,而(b)一个人的中间名是未知的。

您的示例中的错误与这些设计注意事项无关。您只是弄错了名称空间。 https://www.w3.org/2001/XMLSchema-instance应该是http://www.w3.org/2001/XMLSchema-instance