2016-05-18 4 views
1

私はこのプロジェクトを進めており、ユーザーがXMLファイルを指し、そのファイルをXMLスキーマに対して検証できるようにする必要があります。 これまでのところ複雑なものはありません。C#スキーマの検証によって偽の成功が返される

私はそれを適切なXML検証に対して検証しました。 XMLにノードを追加しました - 検証に失敗しました。

完全に無関係のXMLファイルを入力するまで、すべてが完璧に見えました。 私は一時的に折り畳まれていたものを、ずっと前にスケジュールされたタスクマネージャから抽出しました。 ...検証に成功しました。

"WHY"はまだ理解できません。 スキーマに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; 
     } 


    } 

}} 

はスキーマです:

<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に存在しないtargetNamespaceを、あなたのファイルが有効かどうかの判断

あなたはXmlReaderSettings.ValidationFlagsReportValidationWarningsを追加する場合は、あなたがこの効果に警告が表示されます:

警告:マッチングスキーマが見つかりません。検証は行われませんでした。要素 'root'のスキーマ情報が見つかりませんでした。

+0

実際には動作しますが、それは私には意味がありません。 これは警告であってはなりません。 XMLがスキーマに近い場所でもないことは警告しないでください。エラーでなければなりません。 – BlueBunny

関連する問題