Avevo la necessità, in un progetto 2005, di controllare
se un documento xml generato in base ad uno schema, fosse well-formed, così, per
non farlo direttamente su http://www.xmlforasp.net/SchemaValidator.aspx dove
avevo trovato un validatore on-line, ho pensato di provare a fare qualcosa del
genere in VB2005.
Ho creato così una classe il vb2005 ed ho notato che in effetti qualcosa è
cambiato rispetto alla precedente versione, che qui ho commentato
Imports System.XmlPublic Class XMLImport Public XMLError As String Private Sub XMLEvent(ByVal sender As Object, ByVal e As System.Xml.Schema.ValidationEventArgs) XMLError += (e.Message & vbCrLf) End Sub Public Function LoadXMLData(ByVal XMLData As String, ByVal XSDSchema As String) As Boolean XMLError = String.Empty 'Crea il documento XML utilizzando il codice passato in XMLData Dim MyXMLDocument As New System.Xml.XmlDocument Dim MyXSDTextReader As New System.IO.StringReader(XSDSchema) 'crea lo schema con l'handler all'evento di validazione che mi interessa Dim MyXMLSchema As System.Xml.Schema.XmlSchema = System.Xml.Schema.XmlSchema.Read
(MyXSDTextReader, New System.Xml.Schema.ValidationEventHandler(AddressOf XMLEvent)) Dim MyXMLTextReader As New System.IO.StringReader(XMLData) MyXMLDocument.Load(MyXMLTextReader) MyXMLDocument.Schemas.Add(MyXMLSchema) MyXMLDocument.Validate(New System.Xml.Schema.ValidationEventHandler(AddressOf XMLEvent)) 'Obsolete(framework 1.1): 'Dichiara l'XML Reader 'Dim Myreader As XmlReader = XmlReader.Create(MyXMLTextReader) ''Myreader.Settings.ValidationType = ValidationType.Schema 'Myreader.Settings.Schemas.Add(MyXMLSchema) 'Dim MyXMLValidatingReader As New System.Xml.XmlValidatingReader(MyXMLTextReader) 'MyXMLValidatingReader.Schemas.Add(String.Empty, XSDSchema) 'MyXMLValidatingReader.ValidationType = System.Xml.ValidationType.Schema 'MyXMLDocument.CreateDocumentFragment() 'MyXMLSchema.SourceUri = XSDSchema End Function Public Sub Dispose() MyBase.Finalize() End SubEnd Class
Per provarlo :
Private Sub FormXmlValidator_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load LoadFile() End Sub Private Sub Validate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Validate.Click 'dichiaro la classe XmlImport Dim Myreader As New XMLImport 'richiamo il metodo a cui passare i due parametri stringa precedentemente caricati in due textbox Myreader.LoadXMLData(txtxml.Text, txtXsd.Text) 'controllo se il reader contiene errori di validazione If Myreader.XMLError <> String.Empty Then MessageBox.Show(Myreader.XMLError, "Importazione Xml", MessageBoxButtons.OK, MessageBoxIcon.Error) Else MessageBox.Show("Documento Xml Well-Formed", "Importazione Xml", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End If End Sub Public Sub LoadFile() 'legge il file xml Dim MyfileXml As New System.IO.StreamReader("xsd\sidocup.xml", True) txtxml.Text = MyfileXml.ReadToEnd MyfileXml.Close() 'legge il file xsd Dim MyfileXsd As New System.IO.StreamReader("xsd\sidocup.xsd", True) txtXsd.Text = MyfileXsd.ReadToEnd MyfileXsd.Close() End Sub
Magari ha bisogno di essere perfezionato o forse ci sono altri metodi più
veloci, ma per i miei scopi è andato più che bene.
Attendo critiche e insulti
powered by IMHO 1.3