validate xml against xsd doesn't work..

magmo

Member
Joined
Oct 19, 2006
Messages
14
Programming Experience
1-3
Hi

I need to validate the structure of an xml file against a xsd file. I have this code so far...

VB.NET:
[SIZE=2][COLOR=#0000ff]Private [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Sub[/COLOR][/SIZE][SIZE=2] ValidateXml2([/SIZE][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][SIZE=2] FileName [/SIZE][SIZE=2][COLOR=#0000ff]As [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]String[/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][SIZE=2] FileSchema [/SIZE][SIZE=2][COLOR=#0000ff]As [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]String[/COLOR][/SIZE][SIZE=2])[/SIZE]
[SIZE=2]builder = [/SIZE][SIZE=2][COLOR=#0000ff]New[/COLOR][/SIZE][SIZE=2] StringBuilder[/SIZE]
[SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][SIZE=2] productSettings [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2] XmlReaderSettings = [/SIZE][SIZE=2][COLOR=#0000ff]New[/COLOR][/SIZE][SIZE=2] XmlReaderSettings()[/SIZE]
[SIZE=2]productSettings.Schemas.Add([/SIZE][SIZE=2][COLOR=#800000]"generic"[/COLOR][/SIZE][SIZE=2], FileSchema)[/SIZE]
[SIZE=2]productSettings.ValidationType = ValidationType.Schema[/SIZE]
[SIZE=2][COLOR=#0000ff]AddHandler[/COLOR][/SIZE][SIZE=2] productSettings.ValidationEventHandler, [/SIZE][SIZE=2][COLOR=#0000ff]New[/COLOR][/SIZE][SIZE=2] ValidationEventHandler([/SIZE][SIZE=2][COLOR=#0000ff]Address Of[/COLOR][/SIZE][SIZE=2] productSettingsValidationEventHandler)[/SIZE]
[SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][SIZE=2] books [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2] XmlReader = XmlReader.Create(FileName, productSettings)[/SIZE]
[SIZE=2][COLOR=#0000ff]While[/COLOR][/SIZE][SIZE=2] books.Read()[/SIZE]
[SIZE=2][COLOR=#0000ff]End [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]While[/COLOR][/SIZE]
[SIZE=2]MsgBox(builder.ToString)[/SIZE]
[SIZE=2][COLOR=#0000ff]End [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Sub[/COLOR][/SIZE]
 
 
[SIZE=2][COLOR=#0000ff]Sub[/COLOR][/SIZE][SIZE=2] productSettingsValidationEventHandler([/SIZE][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][SIZE=2] sender [/SIZE][SIZE=2][COLOR=#0000ff]As [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Object[/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][SIZE=2] e [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2] ValidationEventArgs)[/SIZE]
[SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE][SIZE=2] e.Severity = XmlSeverityType.Warning [/SIZE][SIZE=2][COLOR=#0000ff]Then[/COLOR][/SIZE]
[SIZE=2]builder.Append([/SIZE][SIZE=2][COLOR=#800000]"WARNING: " & vbCrlf[/COLOR][/SIZE][SIZE=2])[/SIZE]
[SIZE=2]builder.Append(e.Message & vbCrlf)[/SIZE]
[SIZE=2][COLOR=#0000ff]ElseIf[/COLOR][/SIZE][SIZE=2] e.Severity = XmlSeverityType.Error [/SIZE][SIZE=2][COLOR=#0000ff]Then[/COLOR][/SIZE]
[SIZE=2]builder.Append([/SIZE][SIZE=2][COLOR=#800000]"ERROR: " & vbCrlf[/COLOR][/SIZE][SIZE=2])[/SIZE]
[SIZE=2]builder.Append(e.Message & vbCrlf)[/SIZE]
[SIZE=2][COLOR=#0000ff]End [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]End [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Sub[/COLOR][/SIZE]


This is my xml file....


HTML:
<?xml version="1.0" encoding="UTF-8"?>
<products>
<product>
<artnr>String</artnr>
<namn>String</namn>
<namn_old>String</namn_old>
<sortering>String</sortering>
<design>String</design>
<beskrivning>String</beskrivning>
<stav>String</stav>
<stav_under>String</stav_under>
<collection>String</collection>
<color>String</color>
<dimension>String</dimension>
<logo>String</logo>
<bild>String</bild>
<textrad>String</textrad>
<langd>String</langd>
<bredd>String</bredd>
<tjocklek>String</tjocklek>
<yta>String</yta>
<antal>String</antal>
<ytaforpackning>String</ytaforpackning>
<vikt>String</vikt>
<symbol1>String</symbol1>
<symbol2>String</symbol2>
<symbol3>String</symbol3>
<symbol4>String</symbol4>
<symbol5>String</symbol5>
<symbol5>String</symbol5>
<symbol6>String</symbol6>
</product>
</products>

And my xsd file...

HTML:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="generic" elementFormDefault="qualified" targetNamespace="generic"> 
<xsd:element name="products">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="product">
<xsd:complexType>
<xsd:sequence> 
<xsd:element name="artnr" type="xsd:string"/> 
<xsd:element name="namn" type="xsd:string"/>
<xsd:element name="namn_old" type="xsd:string"/>
<xsd:element name="sortering" type="xsd:string"/>
<xsd:element name="design" type="xsd:string"/>
<xsd:element name="beskrivning" type="xsd:string"/>
<xsd:element name="stav" type="xsd:string"/>
<xsd:element name="stav_under" type="xsd:string"/>
<xsd:element name="collection" type="xsd:string"/>
<xsd:element name="color" type="xsd:string"/>
<xsd:element name="dimension" type="xsd:string"/>
<xsd:element name="logo" type="xsd:string"/>
<xsd:element name="bild" type="xsd:string"/>
<xsd:element name="textrad" type="xsd:string"/>
<xsd:element name="langd" type="xsd:string"/>
<xsd:element name="bredd" type="xsd:string"/>
<xsd:element name="tjocklek" type="xsd:string"/>
<xsd:element name="yta" type="xsd:string"/>
<xsd:element name="antal" type="xsd:string"/>
<xsd:element name="ytaforpackning" type="xsd:string"/>
<xsd:element name="vikt" type="xsd:string"/>
<xsd:element name="symbol1" type="xsd:string"/>
<xsd:element name="symbol2" type="xsd:string"/>
<xsd:element name="symbol3" type="xsd:string"/>
<xsd:element name="symbol4" type="xsd:string"/>
<xsd:element name="symbol5" type="xsd:string"/> 
<xsd:element name="symbol5" type="xsd:string"/>
<xsd:element name="symbol6" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

So if I change the artnr element in my xml file from "artnr" to "artnr2" then I want that to raise an error, so I can take proper action. Lets say alert the user that this xml file is not valid. But I must be doing something wrong here beacuse even if I do that I don't see any errors.


Regards
 
Last edited by a moderator:
See this thread about how to use forum markup codes http://www.vbdotnetforums.com/showthread.php?t=14540

Your schema is wrong/malformed, you perhaps want to read through this tutorial first? http://www.w3schools.com/schema/default.asp

Here is also a useful tip, load the xml file into a Dataset and use its WriteXmlSchema method to have the schema generated (should give you a better start at least), code like this:
VB.NET:
Dim ds As New DataSet
ds.ReadXml("data.xml")
ds.WriteXmlSchema("data.xsd")
 
Hi Sorry for the lack of html tag around the code. I have now made some changes and also verified that the following xsd file is valid. But when I run the following code I get this error..

"The root element of a W3C XML Schema should be <schema> and its namespace should be 'http://www.w3.org/2001/XMLSchema'."

And it doesn't matter if I change the element name in my xml file, I just get the error above.

HTML:
Private Sub ValidatingProcess(ByVal XSDPath As String, ByVal XMLPath As String)
builder = New StringBuilder
Try
MyReader = New XmlTextReader(XMLPath)
'Me.Reader = New XmlTextReader(XMLPath)
Dim SR As StreamReader = New StreamReader(XSDPath)
Dim Schema As XmlSchema = New XmlSchema
Schema = XmlSchema.Read(SR, AddressOf ReaderSettings_ValidationEventHandler)
Dim ReaderSettings As XmlReaderSettings = New XmlReaderSettings
ReaderSettings.ValidationType = ValidationType.Schema
ReaderSettings.Schemas.Add(Schema)
AddHandler ReaderSettings.ValidationEventHandler, AddressOf ReaderSettings_ValidationEventHandler
Dim objXmlReader As XmlReader = XmlReader.Create(MyReader, ReaderSettings)
While objXmlReader.Read
End While
Catch SchemaEx As XmlSchemaException
'Throw AccessEx
builder.Append("***Schema error")
builder.Append(vbCrLf)
builder.Append("Linenumber:{0} " & SchemaEx.LineNumber)
Catch Ex As System.Exception
'Throw Ex
End Try
MsgBox(builder.ToString)
End Sub
Private Sub ReaderSettings_ValidationEventHandler(ByVal sender As Object, ByVal args As ValidationEventArgs)
builder.Append("***Validation error")
builder.Append(vbCrLf)
builder.Append("Severity:{0} " & args.Severity)
builder.Append(vbCrLf)
builder.Append("Message:{0} " & args.Message)
builder.Append(vbCrLf)
builder.Append("LineNumber = " & args.Exception.LineNumber.ToString() & vbCrLf)
builder.Append("LinePosition = " & args.Exception.LinePosition.ToString() & vbCrLf)
End Sub

My xsd file..

HTML:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<xsd:element name="products">
<xsd:complexType>
<xsd:sequence>
 <xsd:element name="product">
 <xsd:complexType>
 <xsd:sequence> 
           <xsd:element name="artnr" type="xsd:string"/> 
           <xsd:element name="namn" type="xsd:string"/>
           <xsd:element name="namn_old" type="xsd:string"/>
           <xsd:element name="sortering" type="xsd:string"/>
           <xsd:element name="design" type="xsd:string"/>
           <xsd:element name="beskrivning" type="xsd:string"/>
           <xsd:element name="stav" type="xsd:string"/>
           <xsd:element name="stav_under" type="xsd:string"/>
           <xsd:element name="collection" type="xsd:string"/>
           <xsd:element name="color" type="xsd:string"/>
           <xsd:element name="dimension" type="xsd:string"/>
           <xsd:element name="logo" type="xsd:string"/>
           <xsd:element name="bild" type="xsd:string"/>
           <xsd:element name="textrad" type="xsd:string"/>
           <xsd:element name="langd" type="xsd:string"/>
           <xsd:element name="bredd" type="xsd:string"/>
           <xsd:element name="tjocklek" type="xsd:string"/>
           <xsd:element name="yta" type="xsd:string"/>
           <xsd:element name="antal" type="xsd:string"/>
           <xsd:element name="ytaforpackning" type="xsd:string"/>
           <xsd:element name="vikt" type="xsd:string"/>
           <xsd:element name="symbol1" type="xsd:string"/>
           <xsd:element name="symbol2" type="xsd:string"/>
           <xsd:element name="symbol3" type="xsd:string"/>
           <xsd:element name="symbol4" type="xsd:string"/>
           <xsd:element name="symbol5" type="xsd:string"/> 
           <xsd:element name="symbol5" type="xsd:string"/>
           <xsd:element name="symbol6" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>


My Xml file

HTML:
<?xml version="1.0" encoding="UTF-8"?>
<products>
 <product>
  <artnr>String</artnr>
  <namn>String</namn>
  <namn_old>String</namn_old>
  <sortering>String</sortering>
  <design>String</design>
  <beskrivning>String</beskrivning>
  <stav>String</stav>
  <stav_under>String</stav_under>
  <collection>String</collection>
  <color>String</color>
  <dimension>String</dimension>
  <logo>String</logo>
  <bild>String</bild>
  <textrad>String</textrad>
  <langd>String</langd>
  <bredd>String</bredd>
  <tjocklek>String</tjocklek>
  <yta>String</yta>
  <antal>String</antal>
  <ytaforpackning>String</ytaforpackning>
  <vikt>String</vikt>
  <symbol1>String</symbol1>
  <symbol2>String</symbol2>
  <symbol3>String</symbol3>
  <symbol4>String</symbol4>
  <symbol5>String</symbol5>
  <symbol5>String</symbol5>
  <symbol6>String</symbol6>
 </product>
</products>


Best Regards
 
Back
Top