C# XML XSD验证。当它发生时
我无法理解何时在加载或验证时进行XML验证。下面是下面的代码C# XML XSD验证。当它发生时,c#,xml,xsd,C#,Xml,Xsd,我无法理解何时在加载或验证时进行XML验证。下面是下面的代码 XmlDocument doc = null; try { XmlReaderSettings settings = new XmlReaderSettings( ); settings.Schemas.Add("http://xxx/customs/DealFile/Common/ReleaseGoodsMessage",
XmlDocument doc = null;
try
{
XmlReaderSettings settings = new XmlReaderSettings( );
settings.Schemas.Add("http://xxx/customs/DealFile/Common/ReleaseGoodsMessage",
ConfigurationManager.AppSettings.Get("Schemas"));
settings.ValidationType = ValidationType.Schema;
using (XmlReader reader = XmlReader.Create(path, settings)) {
doc = new XmlDocument( );
doc.Load(reader);
}
ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
doc.Validate(eventHandler);
}
catch(XmlSchemaException xmlErr)
{
// Do something
}
我希望在doc.Validate(eventHandler)行上进行验证;
但是,它总是发生在doc.Load(reader)。如果XML有问题,我有一个例外
XMLHelpers.LoadXML(@"C:\work\Xml2Db\Xml2Db\Data\Tests\BadData\01.xml")
Exception thrown: 'System.Xml.Schema.XmlSchemaValidationException' in System.Xml.dll
xmlErr.Message
"The 'http://xxx/customs/DealFile/Common/ReleaseGoodsMessage:governmentProcedureType' element is invalid -
The value 'a' is invalid according to its datatype 'Int' - The string 'a' is not a valid Int32 value."
这是微软例子中的代码
其实是一样的。
但是,请注意注释//以下验证调用成功。他们还希望在行文档上得到验证
发生了什么。我怀疑您没有区分格式良好的XML和有效的XML 格式良好的XML文档满足XML规范的所有规则。如果没有,您应该从任何XML解析器中得到一个格式良好的错误 如果你也选择 a) 提供一个描述XML文档和 b) 告诉XML处理器根据该XSD进行验证 然后,XML处理器还将检查文档是否满足XML模式中的规则(XML模式由一个或多个XSD组成)
如果您仍然不确定,请编辑您的问题并提供您看到的错误消息。您不需要包含任何机密信息-错误模板足以告诉您它是哪种错误。当您的代码块设置
设置
对象时,它会设置一个模式和验证器以使用验证类型.schema
(即:使用模式)
在设置XmlReader
时,使用设置
也会根据架构进行验证,这会导致基于架构的错误/异常
调用
document.Validate(eventHandler)
是完全冗余的,因为它在所有情况下都会成功—因为xml已经过验证。“以下验证调用成功”的注释是正确的,因为该文档已被证明是有效的。能否包含触发此行为的XML?抱歉,我不能。这是高度机密的。@AlbertLyubarsky是什么阻止了用无害数据替换可信数据的?在我阅读Microsoft页面时,您可以通过在设置中不指定架构来轻松避免Create()
期间的验证。显然,Validate()
执行验证,但您似乎认为,这是获得验证的唯一方法,创建示例与此假设相矛盾。不,情况并非如此。我添加了一个例外以使其更加清楚。
try
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
// the following call to Validate succeeds.
document.Validate(eventHandler);
...