EDIT2:問題は私のxsdのようです。それはほとんどすべてのXMLを検証します。私はここにXSDを投稿することはできません。なぜすべてのXMLがXSDのために有効でしょうか?LINQを使用してXSDでXMLを検証する方法
EDIT:hereの回答で同様のサンプルが見つかりました。同じ問題ですが、xmlとxsdを比較してもエラーはありません。たとえ私がランダムな別のxsdを使用しても、それはすべてが上手であると言っています。
私はLINQなしでそれをやっている例がたくさんありましたが、LINQではどうしますか?
私は例を見つけるためにGoogleを使用しましたが、ほとんどの場合、すべてのXMLを検証して検証をスキップしているようです。 (それは一度それに入ってファイルを拒否しましたが、私はそれを再現できませんでした)
バリデーションをスキップする方法はありますか?どうやらvalidateメソッドは、その文書の名前空間を有効にいずれかのスキーマのコレクションを検索しますので、あなたは、あなたがチェックしているXMLの名前空間に一致するのtargetNamespaceスキーマを持っている必要があり、XMLためにLINQを使用して
public String ValidateXml2(String xml, String xsd)
{
String Message = String.Empty;
var ms = new MemoryStream(Encoding.Default.GetBytes(xml));
// Create the XML document to validate against.
XDocument xDoc = XDocument.Load(ms, LoadOptions.PreserveWhitespace);
XmlSchemaSet schema = new XmlSchemaSet();
bool isError = new bool(); // Defaults to false.
int countError = 1; // Counts the number of errors have generated.
Stream xsdMemoryStream = new MemoryStream(Encoding.Default.GetBytes(xsd));
// Add the schema file you want to validate against.
schema.Add(XmlSchema.Read
(xsdMemoryStream,
new ValidationEventHandler((sender, args) =>
{
Message = args.Exception.Message;
})
));
// Call validate and use a LAMBDA Expression as extended method!
// Don't you love .NET 3.5 and LINQ...
xDoc.Validate(schema, (sender, e) =>
{
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine("Error {0} generated.", countError);
break;
case XmlSeverityType.Warning:
Console.WriteLine("Warning {0} generated.", countError);
break;
}
Console.WriteLine(sender.GetType().Name);
Console.WriteLine("\r\n{0}\r\nType {1}\r\n", e.Message,
e.Severity.ToString());
Console.WriteLine("-".PadRight(110, '-'));
countError++;
isError = true; // If error fires, flag it to handle once call is complete.
}
, true); // True tells the validate call to populate the post-schema-validation
// which you will need later, if you want to dive a littel deeper...
if (isError == true) // Error has been flagged. Lets see the errors generated.
Console.WriteLine("You my friend have {0} error(s), now what?", countError);
else
Console.WriteLine("You rock! No errors...");
Console.Write("\r\n\r\nPress Enter to End");
Console.ReadKey();
return Message;
}