Sie können eine validierende XmlReader-Instanz mithilfe der XmlReaderSettings-Klasse und der Create-Methode erstellen.
private bool ValidateXml(string xmlFilePath, string schemaFilePath, string schemaNamespace, Type rootType)
{
XmlSerializer serializer = new XmlSerializer(rootType);
using (var fs = new StreamReader(xmlFilePath, Encoding.GetEncoding("iso-8859-1")))
{
object deserializedObject;
var xmlReaderSettings = new XmlReaderSettings();
if (File.Exists(schemaFilePath))
{
//select schema for validation
xmlReaderSettings.Schemas.Add(schemaNamespace, schemaPath);
xmlReaderSettings.ValidationType = ValidationType.Schema;
try
{
using (var xmlReader = XmlReader.Create(fs, xmlReaderSettings))
{
if (serializer.CanDeserialize(xmlReader))
{
return true;
//deserializedObject = serializer.Deserialize(xmlReader);
}
else
{
return false;
}
}
}
catch(Exception ex)
{ return false; }
}
}
}
Der obige Code wird eine Ausnahme, wenn das Schema ist ungültig oder es ist nicht in der Lage deserialisieren die XML werfen. rootType ist der Typ des Wurzelelements in der entsprechenden Klassenhierarchie.
Beispiel: Schema auf: XML Schema Tutorial. Speichern Sie die Datei unter D:\SampleSchema.xsd
.
Run xsd.exe
:
- Open 'Startmenü> Alle Programme> Microsoft Visual Studio 2010> Visual Studio Tools> Visual Studio 2010-Eingabeaufforderung'
- In der Eingabeaufforderung:
xsd.exe /c /out:D:\ "D:\SampleSchema.xsd"
- xsd options:
/out
Die Option gibt das Ausgabeverzeichnis an, /c
gibt das Werkzeug zum Generieren von Klassen an
- Die Ausgabeklassenhierarchie ist untervorhanden
- Die erzeugte Klassenhierarchie sieht ein Ding wie diese,
//------------------------------------------------------------------------------
//
// This code was generated by a tool.
// Runtime Version:2.0.50727.4952
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
//
//------------------------------------------------------------------------------
using System.Xml.Serialization;
//
// This source code was auto-generated by xsd, Version=2.0.50727.3038.
//
///
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class note {
private string toField;
private string fromField;
private string headingField;
private string bodyField;
///
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string to {
get {
return this.toField;
}
set {
this.toField = value;
}
}
///
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string from {
get {
return this.fromField;
}
set {
this.fromField = value;
}
}
///
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string heading {
get {
return this.headingField;
}
set {
this.headingField = value;
}
}
///
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string body {
get {
return this.bodyField;
}
set {
this.bodyField = value;
}
}
}
die Klasse in das Visual Studio-Projekt hinzufügen.
Für das obige xsd-Beispiel ist die Stammklasse note
.
Rufen Sie die Methode,
bool isXmlValid = ValidateXml(@"D:\Sample.xml",
@"D:\SampleSchema.xsd",
@"http://www.w3.org/2001/XMLSchema",
typeof(note));
Weitere Informationen:
Danke, genau das habe ich auch gebraucht! – M3NTA7
Verblüffend einfach im Vergleich zu anderen Lösungen, danke! – JBeagle
'validate' sollte mit Großbuchstaben beginnen ... – realsonic