我是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”
感谢您的帮助。
答案 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