6

私がやろうとしているのは、XSD に対して XML を検証することです。これはすべて非常に簡単ですが、名前空間のない XML には問題があります。C# は、名前空間が XSD のターゲット名前空間と一致する場合にのみ xml を検証します。これは正しいように見えますが、名前空間を持たない XML、または SchemaSet とは異なる名前空間を持つ XML では、例外が発生するはずです。これを達成するためのプロパティまたは設定はありますか? または、xml の xmlns 属性を読み取って名前空間を手動で取得する必要がありますか?

クリアする例:

コード:

XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://example.com", @"test.xsd");
settings.Schemas.Add("http://example.com/v2", @"test2.xsd");
settings.ValidationType = ValidationType.Schema;

XmlReader r = XmlReader.Create(@"test.xml", settings);

XmlReader r = XmlReader.Create(new StringReader(xml), settings);
XmlDocument doc = new XmlDocument();
try
{
    doc.Load(r);
}
catch (XmlSchemaValidationException ex)
{

    Console.WriteLine(ex.Message);
}

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://example.com" targetNamespace="http://example.com" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="test">
        <xs:annotation>
            <xs:documentation>Comment describing your root element</xs:documentation>
        </xs:annotation>
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:pattern value="[0-9]+\.+[0-9]+" />
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
</xs:schema>

有効な XML:

<test xmlns="http://example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</test>

XML が無効です。これは検証されません:

<hello xmlns="http://example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</hello>

エラー: The 'http://example.com:hello' element is not declared

無効な XML ですが、名前空間が存在しないため検証されます:

<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</hello>

どうすればこれを修正できますか?

どんな助けでも大歓迎です。

4

2 に答える 2

4

xml 内の無効な名前空間が をトリガーしない理由XmlSchemaValidationExceptionは、これは単なる警告であるためです。

そのため、警告も報告されるようにコードを変更する必要があります。

最初:ValidationflagsプロパティをXmlReaderSettings

XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationFlags = XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.ReportValidationWarnings;

PS: 検証フラグを設定することにより、必要なすべてのフラグを設定していることを確認してください。そうしないと、一部の検証チェックがスキップされます。を使用してProcessIdentityConstraintsいるため、ID 制約 (xs:key、xs:keyref、...) も検証されます。詳細については、http://msdn.microsoft.com/en-us/library/system.xml.schema.xmlschemavalidationflags.aspxを参照してください。

次へ: 警告が報告されたときにバリデーターに何をすべきかを伝えます。警告またはエラーが発生したときにトリガーされる Validator イベントを作成します。

private static void SchemaValidatorHandler(object sender, ValidationEventArgs e)
    {
        if (e.Severity == XmlSeverityType.Warning || e.Severity == XmlSeverityType.Error)
        {
            //Handle your exception
        }



    }

Last : 検証に使用するバリデーター イベント ハンドラーを設定します。

settings.ValidationEventHandler += new ValidationEventHandler(SchemaValidatorHandler);

それでおしまい

于 2013-03-29T11:02:59.533 に答える
1

http://msdn.microsoft.com/en-us/library/ms162371.aspxの方法があることがわかりますXmlDocument.Validate()

XmlDocument にエラーがある場合は例外がスローされ、名前空間が一致しない場合は警告がスローされると思います。XmlValidation とエラーの種類について詳しく読むことができます。 http://msdn.microsoft.com/en-us/library/aa310912%28v=vs.71%29.aspx

msdn
警告からの抜粋の下に貼り付け ValidationEventHandler が呼び出され、XmlSeverityType.Warning と等しい ValidationEventArgs.Severity が渡された場合、ドキュメントの処理は続行されます。例外はスローされず、スキーマ ドキュメントの処理が続行されます。エラー ValidationEventHandler が呼び出され、XmlSeverityType.Error と等しい ValidationEventArgs.Severity が渡された場合、ドキュメントの処理は続行され、無効なデータは破棄されます。例外がスローされ、スキーマ ドキュメントの処理が停止します。
お役に立てれば

于 2013-03-15T10:33:58.130 に答える