2013-02-26 12 views
8

私は入力文書を遵守するためのスキーマを持っているとしましょう。私はこのようなスキーマに従ってファイルを読み込む:.NETで指定されたスキーマに強制的に準拠させる方法はありますか?

// Load the ABC XSD 
var schemata = new XmlSchemaSet(); 
string abcSchema = FooResources.AbcTemplate; 
using (var reader = new StringReader(abcSchema)) 
using (var schemaReader = XmlReader.Create(reader)) 
{ 
    schemata.Add(string.Empty, schemaReader); 
} 

// Load the ABC file itself 
var settings = new XmlReaderSettings 
{ 
    CheckCharacters = true, 
    CloseInput = false, 
    ConformanceLevel = ConformanceLevel.Document, 
    IgnoreComments = true, 
    Schemas = schemata, 
    ValidationType = ValidationType.Schema, 
    ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings 
}; 

XDocument inputDoc; 
try 
{ 
    using (var docReader = XmlReader.Create(configurationFile, settings)) 
    { 
     inputDoc = XDocument.Load(docReader); 
    } 
} 
catch (XmlSchemaException xsdViolation) 
{ 
    throw new InvalidDataException(".abc file format constraint violated.", xsdViolation); 
} 

これは、ファイル内の些細なエラーを検出で正常に動作します。ただし、スキーマが名前空間にロックされているため、以下のような文書は無効であるが、通じ潜入:

<badDoc xmlns="http://Foo/Bar/Bax"> 
    This is not a valid document; but Schema doesn't catch it 
    because of that xmlns in the badDoc element. 
</badDoc> 

私はスキーマを持っている唯一の名前空間がスキーマ検証に合格する必要があることを言いたいです。

答えて

-1

ReportValidationWarningsフラグを設定します。 http://msdn.microsoft.com/en-us/library/system.xml.schema.xmlschemavalidationflags.aspxおよびhttp://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.validationflags.aspxを参照してください。私は上のセトリング終わったソリューションは、基本的にはルートノードが名前空間になっていることを確認することです

settings.ValidationEventHandler += 
    (node, e) => Console.WriteLine("Bad node: {0}", node); 
+1

動作しませんでした。無効な文書を引き渡します。それに応じてサンプルコードを更新しました。 –

2

それはそうと同じくらい愚かな、あなたが見たい事は​​オブジェクトに実際にあります私が期待する。そうでない場合は、真のスキーマ検証エラーを処理するのと同じ方法で扱います。

// Parse the bits we need out of that file 
var rootNode = inputDoc.Root; 
if (!rootNode.Name.NamespaceName.Equals(string.Empty, StringComparison.Ordinal)) 
{ 
    throw new InvalidDataException(".abc file format namespace did not match."); 
} 
+0

@codekaizen - ああ、公正で十分です、それは私のオリジナルの暗黙の驚きが好きでしたが、 "良い"例です:) – JerKimball

+0

合意しましたが、何らかの理由があるかもしれません(例えば、スタック全体を破棄せず、しかし、それほど驚くべきことではないので、私はこの紆余曲折を強調するために、 "馬鹿な"エピソードがすべての責任を負うことを願っています。 – codekaizen

+0

@codekaizenそれはあなたの非常に外交的です。尊重は達成されました。 :) – JerKimball

1

関連する問題