2009-11-01 8 views
5

私は何も気にしたくありません。ドキュメントが有効であることを確認し、そうでない場合はエラーメッセージを出力します。 Googleはthisに私を指摘しましたが、XmlValidatingReaderは廃止されているようです(少なくとも、MonoDevelopが教えてくれるものです)。C#でDTDに対してXML文書を検証するにはどうすればよいですか?

編集:私はMehrdadのヒントを試していますが、問題があります。私はそれをほとんど持っていると思うが、OnValidationEventはどこにも見つからない。どこからOnValidationEventを取得しますか?

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ValidationType = ValidationType.DTD; 
settings.ValidationEventHandler += new ValidationEventHandler(/*trouble is here*/); 
XmlReader validatingReader = XmlReader.Create(fileToLoad, settings); 
+0

ところで、「C#への変換」とはどういう意味ですか?私のコードはC#3.0で*です。 –

+0

@Mehrdad:申し訳ありませんが、私はまだC#1.0を学んでいるうちに書きましたが、 'var'がC#で有効であることを知らなかった。 –

答えて

4

代わりに直接XmlValidatingReader classを作成するには、適切なXmlReaderSettings objectを構築すべきであるとXmlReader.Create methodへの引数として渡す:

var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD }; 
settings.ValidationEventHandler += new ValidationEventHandler(OnValidationEvent); 
var reader = XmlReader.Create("file.xml", settings); 

残りは変更されません。

P.S. OnValidationEventは、検証イベントを処理するために宣言するメソッドの名前です。明らかに、XmlReaderによって生成された検証イベントを購読したくない場合は、その行を削除することができます。

+0

どこからOnValidationEventを取得しますか?私の編集を参照してください。 –

+0

Matthew:それは失敗した検証イベントを処理するために宣言するメソッドです。代わりに例外をスローしたい場合は、その行を完全に削除することができます。 –

2
var messages = new StringBuilder(); 
var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD }; 
settings.ValidationEventHandler += (sender, args) => messages.AppendLine(args.Message); 
var reader = XmlReader.Create("file.xml", settings); 

if (messages.Length > 0) 
{ 
    // Log Validation Errors 
    // Throw Exception 
    // Etc. 
} 

ValidationEventHandler

Lambda Expressions

Type Inference

+0

ええと、Mehrdadはあなたの22分前に本質的に同じ答えを出していませんでしたか? –

+0

この回答は、同じことを達成する別の方法です。 – ChaosPandion

-1

完全な説明:Visual Studio .NETで

  1. 、という名前の新しいVisual C#コンソールアプリケーションプロジェクトを作成し ValidateXml。次の2つがClass1.csの最初の にステートメントを使用して追加します。

    Class1.cs
    using System.Xml;  // for XmlTextReader and XmlValidatingReader 
    using System.Xml.Schema; // for XmlSchemaCollection (which is used later) 
    
  2. 、次のようにMain方法の 開始前にisValidという名前のブール変数を宣言:

    private static bool isValid = true;  // If a validation error occurs, 
                 // set this flag to false in the 
                 // validation event handler. 
    
  3. Mainメソッドのテキスト ファイルからXML文書を読み取るためにXmlTextReaderオブジェクトを作成し、次にXmlValidatingReader〜を作成します検証このXMLデータを次のよう

    XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithDTD.xml"); 
    XmlValidatingReader v = new XmlValidatingReader(r); 
    
  4. XmlValidatingReaderオブジェクト のValidationTypeプロパティが(DTD、XDR、または スキーマ)必要とされる検証の種類を示します。次のようにDTDにこのプロパティを設定します。検証エラーが発生した場合

    v.ValidationType = ValidationType.DTD; 
    
  5. は、検証リーダーは 検証イベントを生成します。検証 イベントハンドラを登録するには、次のコードを追加します(手順7でMyValidationEventHandler メソッドを実装します):

    v.ValidationEventHandler += 
        new ValidationEventHandler(MyValidationEventHandler); 
    
  6. を読んで、XML文書の妥当性を検証するために、次のコードを追加します。 検証エラーが発生した場合は、MyValidationEventHandlerが呼び出され、 にエラーが送信されます。このメソッドは、isValidをfalseに設定します(手順8を参照)。 文書が有効か無効かを確認するために、確認後にisValidのステータスを確認できます。

    while (v.Read()) 
    { 
        // Can add code here to process the content. 
    } 
    v.Close(); 
    
    // Check whether the document is valid or invalid. 
    if (isValid) 
        Console.WriteLine("Document is valid"); 
    else 
        Console.WriteLine("Document is invalid"); 
    
  7. としてMain方法後MyValidationEventHandler方法を記述し、次のとおりです。

    public static void MyValidationEventHandler(object sender, 
                  ValidationEventArgs args) 
    { 
        isValid = false; 
        Console.WriteLine("Validation event\n" + args.Message); 
    } 
    

アプリケーションをビルドして実行します。アプリケーションは、XML文書が有効であることを報告する必要があります。 例: Visual Studio .NETでは、ProductWithDTD.xmlを変更して無効にします(たとえば、<AuthorName>M soliman</AuthorName>要素を削除します)。 アプリケーションを再度実行します。次のエラーメッセージが表示されます。

Validation event 
Element 'Product' has invalid content. Expected 'ProductName'. 
An error occurred at file:///C:/MyFolder/ProductWithDTD.xml(4, 5). 
Document is invalid 
+1

Meh - これはほぼそのままのMSDNサンプルのコピー/ペーストです。少なくとも、リファレンスを提供してください:http://support.microsoft.com/kb/307379 –

関連する問題