【问题标题】:XSD: Validating xsi:nil element not workingXSD:验证 xsi:nil 元素不起作用
【发布时间】:2018-07-06 19:11:51
【问题描述】:

这个问题是询问在 XML 中表示 NULL 的正确方法: What is the correct way to represent null XML elements?

公认的答案似乎是提供属性 xsi:nil="true" 是明确提供空内容的最佳方式。

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

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 的例子说明了什么?

帮助?!? ;)

谢谢。

【问题讨论】:

  • 这样一个问题的答案被接受的事实意味着发起者给了它一个勾号,它并没有使它成为确定的。当谈到关于做 X 的最佳方式的建议时,通常会有很多意见。

标签: xml validation xsd null


【解决方案1】:

在 XML 中表示缺失值至少有三种常用方法:

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

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

您示例中的错误与这些设计考虑无关。您只是弄错了名称空间。 https://www.w3.org/2001/XMLSchema-instance 应该是 http://www.w3.org/2001/XMLSchema-instance(即 http 而不是 https)。

【讨论】:

  • 好的,也许我应该跳过关于提供非内容的最佳方式的信息。该标签与 xsi:nil 一起出现。感谢您发现 https 问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
相关资源
最近更新 更多