.net 模式验证器";“可为零”;对于子节点';不行?

.net 模式验证器";“可为零”;对于子节点';不行?,.net,validation,xsd,.net,Validation,Xsd,由于某些原因,我无法使nillable正确使用.Net模式验证器。我试图找到一种方法使父节点成为可选的,但同时防止空节点通过验证器 以下是当前元素验证器: <xs:element name="Dates" minOccurs="0" maxOccurs="1"> <xs:complexType> <xs:sequence> <xs:element name="From" type="datetime

由于某些原因,我无法使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>

我已尝试将Dates元素更改为nillable=“false”,但这不起作用——空节点仍会使其通过验证程序

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


我是不是遗漏了什么?是的,我总是可以抛出一些代码,让它工作。。。但我敢打赌,在模式声明中有一种变体,可以满足我的需要。

在您的案例中,解决方案是“多项选择”:


有效文件

<?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>

2010-01-20T12:34:45
2011-01-20T12:34:45
2010-01-20T12:34:45
2011-01-20T12:34:45
无效文档

<?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>


如果您实施
的唯一方法是使用一个特殊的名称空间。

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


有效文件

<?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>

2010-01-20T12:34:45
2011-01-20T12:34:45
2010-01-20T12:34:45
2011-01-20T12:34:45
无效文档

<?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节点)验证失败(请参阅)。这看起来方向正确,但当我在schema Validator站点上修改您的模式时,我只会让事情变得更糟。:-)@杰休特你说得对。我发布的版本缺少外部
选项的
maxOccurs=“2”
。你是达曼!或者可能是一个女人——但无论哪种情况/性别,这都是我想要的!非常快乐的露营者!我认为非常接近,但您的第一个示例(使用From/To节点)验证失败(请参阅)。这看起来方向正确,但当我在schema Validator站点上修改您的模式时,我只会让事情变得更糟。:-)@杰休特你说得对。我发布的版本缺少外部
选项的
maxOccurs=“2”
。你是达曼!或者可能是一个女人——但无论哪种情况/性别,这都是我想要的!非常快乐的露营者!