我一直致力于这个项目,该项目应允许用户指向XML文件,并根据XML模式验证该文件。 到目前为止,没有什么“复杂”。
我针对正确的XML测试了它 - 验证成功了。 向XML添加了一个节点 - 验证失败。
一切看起来都很完美,直到我给它提供了一个完全不相关的xml文件。 我在临时工中折叠的,很久以前从预定的任务经理中提取出来的。 ......验证成功了。
我仍然无法理解“为什么”。 模式有一个targetnamespace,它不存在于“random”xml中。 ......结构没什么两样的。 任何人都可以解释验证过程实际如何以及为什么它在这种情况下成功了吗?
'^(~?)#([^#]+)#([^#]+)#$|^([^#]+)#([^#]+)$'
这是架构:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Schema;
namespace XMLtoXSDValidation
{
class clsXMLManage
{
string filepath = AppDomain.CurrentDomain.BaseDirectory;
public bool ValidateSchema(string path)
{
try
{
string schemaPath = Path.Combine(filepath, "XMLSchema1.xsd");
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("XMLtoXSDValidation", schemaPath);
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create(path, settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
document.Validate(eventHandler);
return true;
}
catch (Exception ex)
{
Console.WriteLine("Error: {0}", ex.Message);
return false;
}
}
static void ValidationEventHandler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine("Error: {0}", e.Message);
break;
case XmlSeverityType.Warning:
Console.WriteLine("Warning {0}", e.Message);
break;
}
}
}}
真正对应于架构的XML:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="XMLtoXSDValidation" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="FirstCategory">
<xs:complexType>
<xs:sequence>
<xs:element name="One">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="UserName"/>
<xs:element type="xs:string" name="Password"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Two">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="UserName"/>
<xs:element type="xs:string" name="Password"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="SecondCategory">
<xs:complexType>
<xs:sequence>
<xs:element name="One">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="UserName"/>
<xs:element type="xs:string" name="Password"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Two">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="UserName"/>
<xs:element type="xs:string" name="Password"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
以下是声称成功验证的XML:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="XMLtoXSDValidation">
<FirstCategory>
<One>
<UserName>a</UserName>
<Password></Password>
</One>
<Two>
<UserName>b</UserName>
<Password></Password>
</Two>
</FirstCategory>
<SecondCategory>
<One>
<UserName>a</UserName>
<Password></Password>
</One>
<Two>
<UserName>b</UserName>
<Password></Password>
</Two>
</SecondCategory>
</root>
答案 0 :(得分:1)
关键是这一部分:
架构有一个targetnamespace,它不会出现在&#34; random&#34; XML
基本上,您的架构与XML文件无关,因此验证器无法判断您的文件是否有效。
如果您将ReportValidationWarnings
添加到XmlReaderSettings.ValidationFlags
,那么您会收到有关此效果的警告:
警告:找不到匹配架构。没有验证。无法找到元素&#39; root&#39;。
的架构信息