7

XDocument.Validate 拡張メソッドで Xml スキーマを使用して Xml フラグメントを検証しようとしています。無効な Xml フラグメントが使用されると常に ValidationEventHandler が適切に起動しますが、XmlSchemaValidationException の LineNumber プロパティと LinePosition プロパティの両方が 0 になります。

private bool Validate(XDocument doc)
{
    bool isValid = true;
    List<string> validationErrors = new List<string>();

    XmlSchemaSet schemas = new XmlSchemaSet();
    schemas.Add(null, "MyCustomSchema.xsd");

    doc.Validate(schemas, (sender, args) =>
    {
        validationErrors.Add(String.Format("{0}: {1} [Ln {2} Col {3}]", 
            args.Severity, 
            args.Exception.Message, 
            args.Exception.LineNumber, 
            args.Exception.LinePosition));

        isValid = false;
    }, false);

    return isValid;
}

上記の例での私の目標は、validationErrors を使用して、検証が失敗した理由をユーザーに通知することです。ただし、このメソッドを使用すると、LineNumber と LinePosition は両方とも 0 になります。

スニペットは十分に単純に見え、有効な Xml フラグメントと無効な Xml フラグメントの両方に対して検証するという点で期待どおりに機能するように見えます。

前もって感謝します!

4

3 に答える 3

6

Xmlのテキスト表現を検証するのではなく、オブジェクトモデルを検証します。その結果、メモリにはXElement、XAttributeなどのオブジェクト以外のファイルがないため、行と位置はありません。もう1つの役立つヒントは、XDocumentをロードした後、検証を実行する前に変更した場合(たとえば、要素が追加された場合)、どの行と位置を返す必要があるかを自問することです。Xmlを作成または変更しない場合、最も速い方法はXmlReaderを使用してXmlドキュメントを検証することです。ボーナスとして(入力がファイルまたはストリームの場合)、検証エラーが発生した場合に備えて、行と位置の情報を取得する必要があります。

于 2012-01-24T23:01:53.580 に答える