用于子节点的模式验证器“nillable”不起作用?

时间:2011-01-14 01:02:10

标签: .net validation xsd

出于某种原因,我无法使用 nillable 来正确使用.Net架构验证程序。我正在尝试找到一种方法来使父节点可选,但同时防止空节点通过验证器。

这是当前的元素验证器:

    <xs:element name="Dates" minOccurs="0" maxOccurs="1">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="From" type="datetime" minOccurs="0" maxOccurs="1" />
          <xs:element name="To" type="datetime" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
      </xs:complexType>
    </xs:element>

我尝试将日期元素更改为 nillable =“false”,但这不起作用 - 空节点仍然使其通过验证器。< / p>

我还尝试将所有三个元素节点更改为 nillable =“false” - 这对于检测空父节点很有效,但会导致两个子节点成为必需节点而不是保持可选节点。

我在这里错过了一些东西吗?是的,我总是可以抛出一些代码并使其正常工作......但我敢打赌,架构声明中有一个变化,它会给我我需要的东西。

1 个答案:

答案 0 :(得分:1)

您案例中的解决方案是“多选”:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Dates" minOccurs="0" maxOccurs="1">
                    <xs:complexType>
                        <xs:choice minOccurs="1" maxOccurs="2">
                            <xs:choice maxOccurs="1">
                                <xs:element name="From" type="xs:dateTime" />
                            </xs:choice>
                            <xs:choice maxOccurs="1">
                                <xs:element name="To" type="xs:dateTime" />
                            </xs:choice>
                        </xs:choice>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

有效文件

<?xml version="1.0"?>
<root>
    <Dates>
        <From>2010-01-20T12:34:45</From>
        <To>2011-01-20T12:34:45</To>
    </Dates>
</root>


<?xml version="1.0"?>
<root>
    <Dates>
        <From>2010-01-20T12:34:45</From>
    </Dates>
</root>


<?xml version="1.0"?>
<root>
    <Dates>
        <To>2011-01-20T12:34:45</To>
    </Dates>
</root>

文件无效

<?xml version="1.0"?>
<root>
    <Dates/>
</root>

简单方法

<xs:element name="Dates" minOccurs="0" maxOccurs="1">
    <xs:complexType>
        <xs:sequence>
            <xs:any minOccurs="1" maxOccurs="2" processContents="lax" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

执行<From /><To />的唯一方法是使用特殊命名空间。