Ich verwende XmlSerializer, um Xml achiales zu deserialisieren. Aber ich fand die Klasse xsd.exe generiert bietet nur die Fähigkeit, die XML zu lesen, aber keine Validierung. Wenn beispielsweise ein Knoten in einem Dokument fehlt, ist das Attributfeld der generierten Klasse null und löst nicht wie erwartet eine Validierungsausnahme aus. Wie kann ich das erreichen? Vielen Dank!xmlserializer Validierung
Antwort
Der folgende Code sollte beim Deserialisieren gegen ein Schema validiert werden. Ein ähnlicher Code kann verwendet werden, um beim Serialisieren gegen ein Schema zu validieren.
private static Response DeserializeAndValidate(string tempFileName)
{
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add(LoadSchema());
Exception firstException = null;
var settings = new XmlReaderSettings
{
Schemas = schemas,
ValidationType = ValidationType.Schema,
ValidationFlags =
XmlSchemaValidationFlags.ProcessIdentityConstraints |
XmlSchemaValidationFlags.ReportValidationWarnings
};
settings.ValidationEventHandler +=
delegate(object sender, ValidationEventArgs args)
{
if (args.Severity == XmlSeverityType.Warning)
{
Console.WriteLine(args.Message);
}
else
{
if (firstException == null)
{
firstException = args.Exception;
}
Console.WriteLine(args.Exception.ToString());
}
};
Response result;
using (var input = new StreamReader(tempFileName))
{
using (XmlReader reader = XmlReader.Create(input, settings))
{
XmlSerializer ser = new XmlSerializer(typeof (Response));
result = (Response) ser.Deserialize(reader);
}
}
if (firstException != null)
{
throw firstException;
}
return result;
}
Der folgende Code lädt und validiert Ihre XML manuell mit einer Schemadatei programmgesteuert, so dass Sie mit jeder resulting errors and/or warnings umgehen können.
//Read in the schema document
using (XmlReader schemaReader = XmlReader.Create("schema.xsd"))
{
XmlSchemaSet schemaSet = new XmlSchemaSet();
//add the schema to the schema set
schemaSet.Add(XmlSchema.Read(schemaReader,
new ValidationEventHandler(
delegate(Object sender, ValidationEventArgs e)
{
}
)));
//Load and validate against the programmatic schema set
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Schemas = schemaSet;
xmlDocument.Load("something.xml");
xmlDocument.Validate(new ValidationEventHandler(
delegate(Object sender, ValidationEventArgs e)
{
//Report or respond to the error/warning
}
));
}
Jetzt offensichtlich wünschen Sie die Klassen von xsd.exe erzeugt haben, dies automatisch zu tun und beim Laden (der obige Ansatz würde einen zweiten Umgang mit der XML-Datei benötigen), aber eine Vorbelastung Validate erlauben würde, Sie können eine fehlerhafte Eingabedatei programmgesteuert erkennen.
@ John Saunders - Ich bin zu zweifeln, dass die Klasse Generation Code wahrscheinlich ist sein Betrieb in absehbarer Zeit zu ändern, und die MSDN-Site zeigt keine relevanten Optionen für xsd.exe, so dass ich denke, dass es sinnvoll ist ein vorschlagen Problemumgehung ... – el2iot2
In dem Fragetext drückt das OP aus, dass er möchte, dass eine Ausnahme für ein ungültiges Eingabexml ausgelöst wird. Mit diesem Ansatz wird das erreicht. Ich behaupte nicht, dass dies die einzige Möglichkeit ist, oder sogar, dass es der beste Weg ist. Aber ich reagierte mit einem Ansatz (von Kopf bis Fuß), den ich in der Vergangenheit verwendet hatte, um XML-Dokumente allgemein zu validieren. – el2iot2
- 1. XmlSerializer + Polymorphism
- 2. XmlSerializer wirft System.InvalidOperationException
- 3. C# XmlSerializer Trim Whitespaces
- 4. XmlSerializer UTF-8
- 5. XmlSerializer Liste Artikel Elementname
- 6. XmlSerializer - Deserialize SoapException Detailelement
- 7. Leistung: BinaryFormatter vs XmlSerializer
- 8. xsd.exe/XMLSerializer für Java?
- 9. Automatisch XmlSerializer-Baugruppe erstellen
- 10. XmlSerializer: Deserialize String-Array
- 11. XmlSerializer und nullable Attribute
- 12. XmlSerializer und eingebetteter WhiteSpace
- 13. XmlSerializer und XmlArrayItem
- 14. XmlSerializer vom XSD-Schema erstellen
- 15. XmlSerializer Fehler Serialisierung Schnittstelle Objekte
- 16. XML mit Sammlungen und XmlSerializer
- 17. Attribut nicht von XmlSerializer serialisiert
- 18. XmlSerializer. NULL-String-Eigenschaften beibehalten?
- 19. .net XmlSerializer, ignorieren Eigenschaften Basisklasse
- 20. XmlSerializer Deserialisieren Liste ohne Namespace
- 21. Serialisieren einer ArrayList mit XmlSerializer
- 22. Serialize Datentyp char mit XmlSerializer
- 23. Warum wirft XmlSerializer eine InvalidOperationException?
- 24. Xmlserializer - Kontrollelement-Attribut Paarung (überarbeitet)
- 25. Verwendung von Generika mit XmlSerializer
- 26. Serialisierungsliste <> mit XmlSerializer
- 27. Wie null Eigenschaften auszuschließen, wenn XmlSerializer mit
- 28. XmlSerializer serialisieren generische Liste der Schnittstelle
- 29. XmlSerializer, kodieren base64 ein String Mitglied
- 30. XmlSerializer verwenden zu abgeleiteten Klassen serialisiert
Danke, dass Sie diese Lösung teilen. Da die Validierung in Übereinstimmung mit der Deserialisierung durch Validierung über den XmlReader erfolgt, ist dies ein besserer Ansatz. – el2iot2