Я не понимаю, почему я не могу проверить XML-файл в схеме и затем десериализовать xml в класс.Stumped on my Я не могу проверить и десериализовать XML
Я могу сделать либо или. т. е. если я прокомментирую ValidateXML, то работает ConvertToObject и наоборот. Если оставить в обоих случаях ошибку: «В документе XML есть ошибка (0, 0)» (Обычно, когда я получаю эту ошибку, я обычно оставлял документ открытым до десериализации.
Моя основная логика
foreach (var myFile in Directory.EnumerateFiles(@"C:MyFolder", "*.xml"))
{
try
{
using (var fileStream = new FileStream(myFile, FileMode.Open, FileAccess.Read))
{
if (ValidateXML(fileStream))
{
CreateObjects(fileStream);
goodCounter++;
}
else
{
sb.AppendLine("Validation failed for: " + myFile);
badCounter++;
}
}
}
catch
{
sb.AppendLine(myFile);
}
}
Мой метод проверки:
private bool ValidateXML(Stream stream)
{
try
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load(stream);
xDoc.Schemas.Add(null, @"C:My_XSD.xsd");
ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
xDoc.Validate(eventHandler);
return true;
}
catch
{
return false;
}
}
static void ValidationEventHandler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
//Console.WriteLine("Error: {0}", e.Message);
throw new Exception(e.Message);
//break;
case XmlSeverityType.Warning:
//Console.WriteLine("Warning {0}", e.Message);
throw new Exception(e.Message);
//break;
}
}
Вам может понадобиться установить положение й e filestream вернуться к происхождению, прежде чем пытаться создать свой объект из него. – Kevin
Вы можете десериализовать прямо из вашего 'XmlDocument' с помощью' XmlNodeReader'. См. [Свойство объекта Deserialize с помощью StringReader vs XmlNodeReader] (https://stackoverflow.com/questions/30102275/deserialize-object-property-with-stringreader-vs-xmlnodereader) или [Как инициализировать 'XmlElement []'?] (https://stackoverflow.com/questions/32805732/how-to-initialize-xmlelement). – dbc