2016-05-18 87 views
1

我一直在处理这个项目,该项目应该允许用户指向一个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> 

回答

1

关键是这个标准T:

架构有一个目标名称,这是不存在的“随机” XML

从本质上讲,你的架构无关,与你的XML文件,因此验证无法进行任何关于你的文件是否有效的判断。

如果添加ReportValidationWarningsXmlReaderSettings.ValidationFlags,那么你会得到一个警告,这样的效果:

警告:匹配模式未找到。没有验证发生。找不到元素'root'的模式信息。

+0

确实有效......但这对我没有意义。 这不应该是一个警告。你不应该被警告XML是不接近模式的地方。这应该是一个错误。 – BlueBunny