我编写了以下代码来命名一个名为order.xml的xml文件
private void ValidateOrderXml()
{
// Create the XmlSchemaSet class.
XmlSchemaSet sc = new XmlSchemaSet();
// Add the schema to the collection.
sc.Add("urn:order-schema", "order_schema.xsd");
// Set the validation settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas.Add(sc);
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
// Create the XmlReader object.
XmlReader reader = XmlReader.Create(xmlFileName, settings);
// Parse the file.
try
{
while (reader.Read()) ;
}
catch (XmlException err)
{
;
}
finally
{
reader.Close();
}
}
// Display any validation errors.
private static void ValidationCallBack(object sender, ValidationEventArgs e)
{
Console.WriteLine("Validation Error: {0}", e.Message);
}
但问题是即使xml文件无效,代码也不会给出任何错误。例如,根据模式,根节点应具有名称顺序。我使用了一个带有其他根名称的xml文件。还是经过验证。
答案 0 :(得分:1)
问题是你“吞下”了例外:
// Parse the file.
try
{
while (reader.Read()) ;
}
catch (XmlException err)
{
;
}
finally
{
reader.Close();
}
}
所以保留的每个XmlException
都会消失,因为您在catch
块中没有处理此问题:
catch (XmlException err)
{
; // you should place your error handling logic here
}
根据您希望如何处理异常,您可以在记录器中记录异常消息,然后重新抛出它。 因此,例如,您可以将XmlException作为内部异常抛出一个新异常:
catch (XmlException err)
{
//TODO: log your exception message in a logger
throw new Exception("Xml has not been validated appropriately", err);
}
或者您可以简单地重新抛出原始异常:
catch (XmlException err)
{
//TODO: log your exception message in a logger
throw;
}
请记住,你永远不应该这样做:
catch (XmlException err)
{
//TODO: log your exception message in a logger
throw err; // <-- DON'T DO THIS!
}
因为它抛出原始异常但重置堆栈跟踪,销毁所有堆栈跟踪信息直到catch块:/