我一直在处理这个项目,该项目应该允许用户指向一个XML文件,并且该文件要根据XML模式进行验证。 到目前为止没有任何“复杂”。C#架构验证返回假成功
我对它进行了正确的XML测试 - 验证成功。 向XML添加节点 - 验证失败。
一切看起来很完美,直到我喂它一个完全不相关的XML文件。 我在临时折叠中的一个,很久以前从计划任务管理器中提取出来的。 ...并验证成功。
我还是不明白“为什么”。 模式有一个目标名称空间,它不存在于“随机”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;
}
}
}}
这里是架构:
<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>
,这里是一个声称成功验证XML:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Author>V-PC\V</Author>
</RegistrationInfo>
<Triggers>
<TimeTrigger>
<StartBoundary>2014-03-16T17:27:02</StartBoundary>
<Enabled>true</Enabled>
</TimeTrigger>
<LogonTrigger>
<Enabled>true</Enabled>
</LogonTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>S-1-5-18</UserId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>StopExisting</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>P3D</ExecutionTimeLimit>
<Priority>7</Priority>
<RestartOnFailure>
<Interval>PT5M</Interval>
<Count>3</Count>
</RestartOnFailure>
</Settings>
<Actions Context="Author">
<Exec>
</Exec>
</Actions>
</Task>
确实有效......但这对我没有意义。 这不应该是一个警告。你不应该被警告XML是不接近模式的地方。这应该是一个错误。 – BlueBunny