8

入力ドキュメントに準拠させたいスキーマがあるとします。次のようなスキーマに従ってファイルをロードします。

// 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>

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

4

3 に答える 3

2

ばかげているように見えますが、見たいのは実際にはXmlReaderSettingsオブジェクトにあります。

settings.ValidationEventHandler += 
    (node, e) => Console.WriteLine("Bad node: {0}", node);
于 2013-02-26T20:52:13.507 に答える
1

最終的に落ち着いた解決策は、基本的にルートノードが期待する名前空間にあることを確認することです。そうでない場合は、真のスキーマ検証の失敗を処理するのと同じ方法で処理します。

// 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.");
}
于 2013-03-01T20:26:26.917 に答える
-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 .

于 2013-02-26T20:11:41.433 に答える