私はこのプロジェクトを進めており、ユーザーが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>
実際には動作しますが、それは私には意味がありません。 これは警告であってはなりません。 XMLがスキーマに近い場所でもないことは警告しないでください。エラーでなければなりません。 – BlueBunny