2012-01-09 2 views
5

XDocument.Validate拡張メソッドでXmlスキーマを使用してXmlフラグメントを検証しようとしています。無効なXMLフラグメントが使用されるたびのValidationEventHandlerが正しく発射しかしXmlSchemaValidationExceptionの両方の行番号とLinePosition特性が0XmlSchemaValidationException.LineNumberとLinePositionは、XDocument.ValidateでXmlスキーマを検証するときに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フラグメントの両方を検証するうえで、期待通りに機能しているようです。

ありがとうございます!

+0

私が見ることができる限り、インスタンス化されるXmlSchemaValidatorは内部DummyPostionのみを使用し、より優れた実装を注入するオプションは表示されません。 – rene

答えて

4

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

+0

Pawel、あなたの非常に合理的な応答に感謝します。私はXDocumentを検証したいと思っていました。私は、XmlReaderに対して妥当性を検証するためにアプリケーションを変更してから、XDocumentリファレンスを作成します。 – buckindb

+0

私はあなたが同時に両方を行うことができるはずだと思う - あなたはそれがドキュメントを検証し、XDocument.Load()メソッドにリーダーを渡すようにリーダーを設定することができます... – Pawel

関連する問題