【发布时间】:2016-06-27 18:05:59
【问题描述】:
我很困惑为什么我不能将 XML 文件验证为架构,然后将 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;
}
}
【问题讨论】:
-
在尝试从中创建对象之前,您可能需要将文件流的位置设置回原点。
-
您可以使用
XmlNodeReader直接从您的XmlDocument反序列化。请参阅Deserialize object property with StringReader vs XmlNodeReader 或How to initializeXmlElement[]?。