2011-01-05 16 views
1

もう一度変わった状況:"循環属性グループ参照"

私は与えられたXMLをXSDに対して検証し、検証が失敗したときに例外をスローする機能を持っています。 (関数は、XMLコールを受けるのWebPageから呼び出される)

コール

if (!xmlvld.ValidXmlDoc(X, "", "https://somepathtofile.xsd")) 
    throw new Exception(xmlvld.ValidationError + "1"); 

と、検証機能は

/// <summary> 
    /// This method validates an xml string against an xml schema. 
    /// </summary> 
    /// <param name="xml">StringReader containing xml</param> 
    /// <param name="schemaNamespace">XML Schema Namespace</param> 
    /// <param name="schemaUri">XML Schema Uri</param> 
    /// <returns>bool</returns> 
    public bool ValidXmlDoc(StringReader xml, string schemaNamespace, string schemaUri) 
    { 
     // Continue? 
     if (xml == null || schemaNamespace == null || schemaUri == null) 
     { 
      return false; 
     } 

     isValidXml = true; 
     XmlValidatingReader vr; 
     XmlTextReader tr; 
     XmlSchemaCollection schemaCol = new XmlSchemaCollection(); 
     schemaCol.Add(schemaNamespace, schemaUri); 

     try 
     { 
      // Read the xml. 
      tr = new XmlTextReader(xml); 
      // Create the validator. 
      vr = new XmlValidatingReader(tr); 
      // Set the validation tyep. 
      vr.ValidationType = ValidationType.Auto; 
      // Add the schema. 
      if (schemaCol != null) 
      { 
       vr.Schemas.Add(schemaCol); 
      } 
      // Set the validation event handler. 
      vr.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack); 
      // Read the xml schema. 
      while (vr.Read()) 
      { 
      } 

      vr.Close(); 

      return isValidXml; 
     } 
     catch (Exception ex) 
     { 
      this.ValidationError = ex.Message; 
      return false; 
     } 
     finally 
     { 
      // Clean up... 
      vr = null; 
      tr = null; 
     } 
    } 

非常に単純であり、これが最後の2のために非常によく働いたの両方最近、検証関数は次のメッセージを返すようになりました。

[ValidationError]Circular attribute group reference.[/ValidationError] 

私はアプリケーションプールをリサイクルし、同じXMLをもう一度送信すると、XSDも送信されたXMLも変更されていません(私は数秒ごとに同じXMLを送信し、結果をチェックする "ping"プログラムを実行しました)バリデーションにはしばらく時間がかかります(いくつかは数分から数時間です)。

XSDは呼び出し元のページと同じディレクトリにあり、サーバーログにはHTTP/200応答でXSDへの要求が表示されますが、HTTPSをローカルパスに変更しようとしてもエラーは同じです無効なアドレスを指し示すとHTTP/404または無効なパス例外が発生し、XSDファイルの読み取りを試みます)

もう一度リサイクルするとすぐに解決されますが、5分ごとにリサイクルできません。

ありがとうございます! Simon

+0

xmlとxsdのサンプルが役に立ちます。 – Kev

+0

検証をトリガするのは何ですか?これはどのくらいの頻度で発生しますか? –

+0

@Kev - XMLの例ans XSDは、私がアップロードできないと思うものですが、XSDとXMLの両方がうまくいっています。アプリケーションプールをリサイクルした後、うまく動作します。 @James B - 検証は、XMLリクエストが受信されるたびに実行されます。 100回/分 – SimSimY

答えて

1

この回答は気に入らないでしょうが、明らかにXmlValidatingReaderは.NET 2.0では廃止されました。おそらくこのような問題のためでしょうか?

validate using an XmlReaderへの提案です。このリンクは、ヘルプファイルの2.0バージョン用です。XmlValidatingReaderからの変換に固有のいくつかの詳細が含まれています。最新のバージョンのヘルプは、上部のドロップダウンから利用できます。

This linkは、XmlValidatingReaderについての詳細を時代遅れにしています。

XmlReaderを使用する例は、hereです。

+0

遅れて申し訳ありません - あなたは正しいです。私はそれが好きではないが、あなたは正しい。 – SimSimY