| 

.NET C# Java Javascript Exception

1
Ich muss ein WebService entwickeln, wo unsere Kunden via einer XML-Datei bestellen können. Diese XML-Datei soll dann am Server validiert werden und zwar nach dem vorgegebenen XML-Schema.
Derzeit kann ich nur einen XML-String übergeben und die Validierung funktioniert auch nicht richtig.
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports System.Xml
Imports System.IO

' Um das Aufrufen dieses Webdiensts aus einem Skript mit ASP.NET AJAX zuzulassen, heben Sie die Auskommentierung der folgenden Zeile auf.
<System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://spagsrv1:8081/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class SpagyraWebService
Inherits System.Web.Services.WebService

Private xmlCheck As clsXmlValidator = New clsXmlValidator
'Private XMLSchemaDatei As String = "D:\Daten\VWS.NET\WebService\Bin\Bestellung.xsd"
Private XMLSchemaDatei As String = "c:\spagyrasoftware\projekte\webservice\Bestellung.xsd"

<WebMethod()> _
Public Function OrderInformation(ByVal BestellXML As String) As String
If xmlCheck.ValidateXml(BestellXML, XMLSchemaDatei) Then
Return "XMLBestellung hat gültiges Schema!"
Else
Return String.Format("XMLBestellung ist kein gültiges Schema! -> {1}", xmlCheck.ErrorMessage)
End If
End Function

End Class

...UND HIER DIE KLASSE clsXmlValidator DAZU
Imports System.Xml
Imports System.IO
Imports System.Xml.Schema
Imports System.Drawing

'/ <SUMMARY>
'/ This class validates an xml string or xml document against an xml
'/ schema.
'/ It has public methods that return a boolean value depending on
'/ the validation
'/ of the xml.
'/ </SUMMARY>
Public Class clsXmlValidator
Private schemaValidation As ValidationEventHandler = New ValidationEventHandler(AddressOf ValidationHandler)
Private _errorText As String = ""

Public ReadOnly Property ErrorMessage()
Get
Return _errorText
End Get
End Property

Public Function ValidateXml(ByVal xmlFile As String, ByVal xmlSchemaName As String) As Boolean
Try
Dim tr As XmlTextReader
Dim xsc As XmlSchemaCollection
Dim vr As XmlValidatingReader

tr = New XmlTextReader(New StringReader(xmlFile))
xsc = New XmlSchemaCollection
vr = New XmlValidatingReader(strXMLDoc, XmlNodeType.Document, null)



'Using myFile As New FileStream(xmlFileName, FileMode.Open, FileAccess.Read, FileShare.None)
Dim settings As XmlReaderSettings = New XmlReaderSettings()
'Dim settings As XmlSchemaSet = New XmlSchemaSet()
'settings.Add(GetSchema(xmlSchemaName))

settings.Schemas.Add(GetSchema(xmlSchemaName))
settings.ValidationType = ValidationType.Schema

Dim reader As XmlReader = XmlReader.Create(New StringReader(xmlFile)) '2.Parameter = settings
Dim xDoc As XmlDocument = New XmlDocument()
'xDoc.Load(reader)

'xDoc.Load(myFile)
xDoc.Load(reader)
xDoc.Schemas.Add(GetSchema(xmlSchemaName))
Try
xDoc.Validate(schemaValidation)
Return True
Catch ex As XmlSchemaValidationException
_errorText = ex.ToString + vbCr
_errorText += String.Format("Fehler in Zeile: {0} -> ", ex.LineNumber)
_errorText += String.Format("Fehler an Position: {0}", ex.LinePosition)
Return False
Catch ex As XmlSchemaException
_errorText = ex.ToString + vbCr
_errorText += String.Format("Fehler in Zeile: {0} -> ", ex.LineNumber)
_errorText += String.Format("Fehler an Position: {0}", ex.LinePosition)
Return False
Catch ex As Exception
_errorText = ex.ToString
Return False
End Try
'End Using

Catch ex As Exception
_errorText = ex.ToString
Return False
End Try
End Function

Private Function GetSchema(ByVal filePath As String) As XmlSchema
Dim schema As XmlSchema
Using s As New System.IO.FileStream(filePath, FileMode.Open)
Using reader As New StreamReader(s)
schema = XmlSchema.Read(reader, Nothing)
End Using
End Using
Return schema
End Function

Private Sub ValidationHandler(ByVal sender As Object, ByVal e As System.Xml.Schema.ValidationEventArgs)
Select Case e.Severity
Case XmlSeverityType.Error
_errorText = e.Message
Case XmlSeverityType.Warning
_errorText = e.Message
End Select

Throw e.Exception
End Sub

End Class
News:
10.03.2011
Gerhard 21 1 2
Eine genauere Beschriebung deines Problems wäre hilfreich.
Floyd 10.03.2011
2 Antworten
0
Hallo Gerhard

Ich prüfe mit nachfolgender Klasse.
Dazu muss der Standort des Schemas im XML angegeben werden.
<request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MeinPfad\MeinSchema.xsd">
Nur das Schema ohne Pfad kann angegeben werden, wenn xml und xsd im selben Verzeichnis liegen.

Public Class XMLOperations

#Region "Constructors"
''' <summary>
''' Prüft, ob ein XML-Dokument gemäss seiner DTD-Definition gültig ist. Wenn die Propertiy Message leer ist, war die Prüfung erfolgreich.
''' </summary>
''' <param name="xmlFile">Pfad auf das zu prüfende XML-Dokument.</param>
''' <param name="schemaType">Der Typ des Schemas des zu prüfenden XML.</param>
''' <remarks></remarks>
Private Sub New(ByVal xmlFile As String, ByVal schemaType As SchemaTypes)
pXMLFile = xmlFile

'Setzen der Validierungseinstellungen
Dim settings As Xml.XmlReaderSettings = New Xml.XmlReaderSettings()
Select Case schemaType
Case SchemaTypes.DTD
settings.ProhibitDtd = False
settings.ValidationType = Xml.ValidationType.DTD
AddHandler settings.ValidationEventHandler, AddressOf ValidationCallBack
Case SchemaTypes.XSD
settings.ValidationType = Xml.ValidationType.Schema
settings.ValidationFlags = Xml.Schema.XmlSchemaValidationFlags.ProcessSchemaLocation Or Xml.Schema.XmlSchemaValidationFlags.ReportValidationWarnings
AddHandler settings.ValidationEventHandler, AddressOf ValidationCallBackXSD
End Select

'Reader erstellen und prüfen
If IO.File.Exists(pXMLFile) Then
Dim reader As Xml.XmlReader = Xml.XmlReader.Create(pXMLFile, settings)
Try
While reader.Read()
End While
Catch ex As Exception
Select Case schemaType
Case SchemaTypes.DTD
SetMessageDTDDefinitionFoultIntro()
Case SchemaTypes.XSD
SetMessageXSDDefinitionFoultIntro()
End Select
pMessage &= Environment.NewLine & "'" & ex.Message & "'"
End Try
reader.Close()
reader = Nothing
Else
pMessage = Resources.ResHandler.GetStringFromLanguage("XMLOperations.New.Message01", pXMLFile)
End If

End Sub
#End Region

#Region "Private Declarations"
Private Enum SchemaTypes
DTD
XSD
End Enum
Private pMessage As String = ""
Private pXMLFile As String = ""
#End Region

#Region "Private ReadOnly Properties"
''' <summary>
''' Zeigt eine Meldung an, falls bei der Instanzierung oder bei einer Verarbeitung ein Fehler aufgetreten ist.
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Private ReadOnly Property Message() As String
Get
Return pMessage
End Get
End Property
#End Region

#Region "Public Shared Methods"
''' <summary>
''' Prüft, ob ein XML-Dokument gemäss seiner DTD-Definition gültig ist.
''' </summary>
''' <param name="xmlFile">Pfad auf das zu prüfende XML-Dokument.</param>
''' <param name="message">Meldung mit der Ursache des Problems, falls die Prüfung fehl schlägt.</param>
''' <returns>True, wenn die Prüfung erfolgreich war.</returns>
''' <remarks></remarks>
Public Shared Function CheckIsValid(ByVal xmlFile As String, ByRef message As String) As Boolean
Dim retVal As Boolean = False

Dim ob As New XMLOperations(xmlFile, SchemaTypes.DTD)
If ob.Message.Length > 0 Then
message = ob.Message
Else
retVal = True
End If
ob = Nothing

Return retVal
End Function

''' <summary>
''' Prüft, ob ein XML-Dokument gemäss seiner XSD-Definition gültig ist.
''' </summary>
''' <param name="xmlFile">Pfad auf das zu prüfende XML-Dokument.</param>
''' <param name="message">Meldung mit der Ursache des Problems, falls die Prüfung fehl schlägt.</param>
''' <returns>True, wenn die Prüfung erfolgreich war.</returns>
''' <remarks></remarks>
Public Shared Function CheckIsValidXSD(ByVal xmlFile As String, ByRef message As String) As Boolean
Dim retVal As Boolean = False

Dim ob As New XMLOperations(xmlFile, SchemaTypes.XSD)
If ob.Message.Length > 0 Then
message = ob.Message
Else
retVal = True
End If
ob = Nothing

Return retVal
End Function

#Region "Private Methods"
''' <summary>
''' Setzt die Standard-Meldungseröffnung.
''' </summary>
''' <remarks></remarks>
Private Sub SetMessageDTDDefinitionFoultIntro()
If pMessage.Length = 0 Then
pMessage = Resources.ResHandler.GetStringFromLanguage("XMLOperations.SetMessageDTDDefinitionFoultIntro.Message01", pXMLFile)
End If
End Sub

''' <summary>
''' Setzt die Standard-Meldungseröffnung.
''' </summary>
''' <remarks></remarks>
Private Sub SetMessageXSDDefinitionFoultIntro()
If pMessage.Length = 0 Then
pMessage = String.Format("Der Inhalt der Datei '{0}' entspricht nicht den Definitionen gemäss XSD.", pXMLFile)
End If
End Sub

#End Region

#Region "Handles"
''' <summary>
''' Wird bei der Prüfung der XML-Datei gemäss DTD bei einem Validierungsfehler ausgelöst.
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub ValidationCallBack(ByVal sender As Object, ByVal e As Xml.Schema.ValidationEventArgs)
SetMessageDTDDefinitionFoultIntro()
pMessage &= Environment.NewLine & "'" & e.Message & "'"
End Sub

''' <summary>
''' Wird bei der Prüfung der XML-Datei gemäss DTD bei einem Validierungsfehler ausgelöst.
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub ValidationCallBackXSD(ByVal sender As Object, ByVal e As Xml.Schema.ValidationEventArgs)
SetMessageXSDDefinitionFoultIntro()
pMessage &= Environment.NewLine & "'" & e.Message & "'"
End Sub
#End Region

End Class


Hoffe Du kannst mit dem etwas anfangen.

Gruss, Andreas
10.03.2011
Andreas Schädler 117 1 6
Zur besseren Lesbarkeit Programmcode mit [code][/code] versehen.
Jürgen Luhr 10.03.2011
Schon wieder was gelernt:-). Werde ich nächstes mal machen. Danke für den Hinweis.
Andreas Schädler 10.03.2011
0
Danke für deinen Code. Werde ich testen, aber zuvor habe ich noch eine Frage:

Was ist "Resources.ResHandler.GetStringFromLanguage"? Das kennt mein VS 2010 nicht.

Gruss
Gerhard
15.03.2011
Gerhard 21 1 2
Sorry, hätte ich noch entfernen müssen. Dies ist so ein Gebastel für die Unterstützung von Mehrsprachigkeit. Dahinter verbirgt sich ein Text.

Gruss
Andreas
Andreas Schädler 21.03.2011

Stelle deine Webservice-Frage jetzt!