ValidationType.Schema验证

时间:2014-12-08 05:00:01

标签: .net xml validation xsd xsd-validation


我是Schema验证的新手,我有一个使用“ValidationType.Schema”执行模式验证的代码。
在我的输出XML文件中有一些可选的标记,为了验证这一点,我将相应的XSD文件标记设置为“MinOccurs = 0”,但是我仍然得到模式验证失败的错误。
我无法弄清楚XSD中提到标签的SEQUENCE是否也与XML文件中标签的SEQUENCE有关,或者这是否只验证了存在。
例如:
案例1:
---输出XML ---
<tag1>1</tag1>
<tag2>2</tag2>
--- -XSD文件
<tag1>
<tag2>
案例2:
---输出XML ---
<tag2>1</tag2>
<tag1>2</tag1>
---- XSD文件
{{1 }} {
{1}}
哪一个会失败?如果有的话?
我使用的验证类型为“ValidationType.Schema”

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

@ user1705851,节点顺序很重要,因为元素可以具有相同的名称,但您可以通过在xsd中使用所有属性来避免这种情况。下面给出了节点的工作代码。

Imports System.Xml.Schema 
Module Module1
Dim errors As Boolean = False


Sub Main()
    Dim xsdMarkup As XElement = _
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>


<xsd:element name='Root'>
    <xsd:complexType>
        <xsd:all>
            <xsd:element name='tag1' minOccurs='0' maxOccurs='1'/>
            <xsd:element name='tag2' minOccurs='0' maxOccurs='1'/>
        </xsd:all>
    </xsd:complexType>
</xsd:element>

Dim schemas As XmlSchemaSet = New XmlSchemaSet()
    schemas.Add("", xsdMarkup.CreateReader)

    Dim doc1 As XDocument = _
        <?xml version='1.0'?>
        <Root>
            <tag1>1</tag1>
            <tag2>2</tag2>
        </Root>

    Dim doc2 As XDocument = _
        <?xml version='1.0'?>
        <Root>
            <tag2>1</tag2>
            <tag1>2</tag1>
        </Root>

    Console.WriteLine("Validating doc1")
    errors = False
    doc1.Validate(schemas, AddressOf XSDErrors)
    Console.WriteLine("doc1 {0}", IIf(errors = True, "did not validate", "validated"))

    Console.WriteLine()
    Console.WriteLine("Validating doc2")
    errors = False
    doc2.Validate(schemas, AddressOf XSDErrors)
    Console.WriteLine("doc2 {0}", IIf(errors = True, "did not validate", "validated"))
    Console.ReadLine()
End Sub
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
    Console.WriteLine("{0}", e.Message)
    errors = True
End Sub
End Module