验证xml到xsd只捕获特定错误

时间:2010-07-15 18:13:46

标签: c# xml validation xsd

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

在这种情况下,该文件包含一组人。

我想抓住的是错误: 1:人员节点之外的Children节点。 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>

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

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

如果你无法通过API获得所需的信息(某些API确实认为验证只是一种是/否的话),一种可能的后备替代方法是使用ssamuel中描述的单独模式进行验证。回答,以便唯一的验证错误是您希望认为是致命的错误。

那就是:有两种方法可以解决这个问题:(1)超越你必须总是在无效输入上中止的想法:让验证器给你更多信息,这样你就可以决定停止或继续。或者(2)超越了存在适用于文档的所有处理的单个模式的想法:使用一个模式来创建文档,使用不同的模式来决定如何处理输入。