C# 将xml验证为xsd以仅捕获特定错误

C# 将xml验证为xsd以仅捕获特定错误,c#,xml,validation,xsd,C#,Xml,Validation,Xsd,我有一个导入文件,需要跳过并继续处理特定错误。我想忽略数据类型、最小/最大长度和必填字段的错误。我希望捕获并显示有关格式不正确和位置错误的项目的错误 在本例中,该文件包含一组人员 我想捕捉以下错误: 1:人员节点之外的子节点。 2:人员节点外的子节点。 3:人员节点外侧的人员 我想忽略错误: 1:孩子没有名字。 2:此人没有出生日期 <xs:element name="People"> <xs:complexType> <xs:sequence>

我有一个导入文件,需要跳过并继续处理特定错误。我想忽略数据类型、最小/最大长度和必填字段的错误。我希望捕获并显示有关格式不正确和位置错误的项目的错误

在本例中,该文件包含一组人员

我想捕捉以下错误: 1:人员节点之外的子节点。 2:人员节点外的子节点。 3:人员节点外侧的人员

我想忽略错误: 1:孩子没有名字。 2:此人没有出生日期

<xs:element name="People">
<xs:complexType>
  <xs:sequence>
    <xs:element name="Person" minOccurs="1" maxOccurs="unbounded">
      <xs:complexType>
        <xs:all>
          <xs:element name="FirstName" minOccurs="1" maxOccurs="1">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:minLength value="1"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:element>
          <xs:element name="LastName" minOccurs="1" maxOccurs="1">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:minLength value="1"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:element>
          <xs:element name="BirthDate" type="Date" minOccurs="1" maxOccurs="1"/>              
          <xs:element name="Children">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Child" minOccurs="1" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:all>
                      <xs:element name="FirstName" minOccurs="0" maxOccurs="1">
                        <xs:simpleType>
                          <xs:restriction base="xs:string">
                            <xs:minLength value="1"/>
                          </xs:restriction>
                        </xs:simpleType>
                      </xs:element>
                      <xs:element name="BirthDate" type="Date" minOccurs="1" maxOccurs="1"/>              
                      </xs:all>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:all>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>


按如下方式更改您的模式:

  • 在Child下的Firstname元素声明中,添加一个属性type=“xs:string”。另外,删除元素声明的所有内容(simpleType等)。如果需要,可以使标记自动关闭
  • 在Birthdate元素声明中,将minOccurs从1更改为0
第一个更改删除了当前对子项名称的限制,即内容长度至少为一个字符。添加type属性是必要的,因为您要删除元素类型的当前定义

第二个更改告诉验证器出生日期不是必需的


进行这些更改,您想要验证的XML应该是正确的。

当出现无效输入时,停止还是继续,原则上完全是消费软件的选择,因此您所描述的内容在逻辑上是一致的,尽管可能有点不寻常。如果您可以通过正在使用的API获得所需的信息,那么没有理由不让软件按照您所描述的方式运行,这可能是更好的选择。(但我帮不了你。)

如果您无法通过API获得所需的信息(一些API确实假设验证只是一种是/否的事情),一种可能的回退方案是使用单独的模式进行验证,如ssamuel的回答中所述,这样唯一的验证错误就是您希望认为是致命的错误


也就是说:有两种方法可以解决这个问题:(1)克服必须在无效输入时中止的想法:让验证器向您提供更多信息,以便您可以决定停止或继续。或者(2)不要认为只有一个模式适用于文档的所有处理:使用一个模式创建文档,使用另一个模式决定如何处理输入。

谢谢,但我想保留这些项目。我希望创建文件的人查看哪些字段是必需的。但是当他们试图导入文件时,我需要忽略一些项目。我遇到的问题是,在验证时调用的ValidationCallBack事件无法查看发生了什么类型的错误。因此,我不想对模式进行更改,而是修改验证回调方法,以便能够读取并确定抛出的错误,或者仅在我确定为灾难性错误时调用验证回调。