2011-01-21 19 views
0

XmlReaderと関連する​​オブジェクトを使用して、一部のドキュメントでXSDの検証を実行しようとしています。私はValidationEventHandlerを宣言しています。これは、読者が検証問題に遭遇するたびに呼び出されると予想しています。しかし、私は読者を作成しようとするとXSDValidationExceptionを取得しています。.NET XSD検証の混乱

何が原因で例外が発生するのでしょうか?メッセージは次のとおりです。

System.Xml.Schema.XmlSchemaValidationException: 'http://www.w3.org/XML/1998/namespace:base'属性が宣言されていません。

基本となるスキーマに問題がありますか?

+0

全体の例外は( 'ex.ToString()')何ですか?それはあなたに行番号と位置、そしておそらくファイル名を伝えるかもしれません。 –

答えて

0

実際のXML文書に名前空間にルート要素がないことを確認します。

このエラーは、スキーマ検証にターゲット名前空間があり、検証されるXML文書に名前空間のないルート要素が含まれている場合に表示されます。

残念なことに、この場合のスキーマの検証では、ルート要素に一致するスキーマが見つからないという警告が生成され、その警告は、警告を報告する特定のフラグが設定されている場合にのみ表示されます。 XmlDocumentのメソッドを検証します。

0

​​属性のスキーマとドキュメントを検索します。存在する場合、その属性を定義するスキーマがスキーマセットに含まれている必要があります。

0

コードサンプルは、あなたがやっていることを確認するのにはいいと思っていましたが、私は同じ場所にいるのでいくつかの仮定をすることができます。私はUsing XSDs with includesにやって来て、受け入れられた答えを私のために働かせました。

問題はXmlReaderCreate()XmlReaderをINGの間、あなたはそれを指定しない場合、ベースパスが含まスキーマ何のためにあるのかを知っていないようだということです。 XMLファイルへのファイルパスがあると仮定すると、XmlReader.Create(Stream input, XmlReaderSettings settings, String baseUri)を使用し、XMLファイルへのパスをbaseUriとして指定します。

例:

using System.IO; 
using System.Xml; 
using System.Xml.Schema; 

public void LoadXml(string path) { 
    XmlDocument doc = new XmlDocument(); 
    XmlReader docReader; 

    XmlReaderSettings rdrOpts = new XmlReaderSettings(); 
    rdrOpts.ValidationType = ValidationType.Schema; 
    rdrOpts.ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation; 

    try { 
     // This line is what you're looking for: 
     docReader = XmlReader.Create(new FileStream(path, FileMode.Open, FileAccess.Read), rdrOpts, Path.GetDirectoryName(path)); 
     doc.Load(docReader); 
    } catch (System.Xml.Schema.XmlSchemaValidationException ex) { 
     //... 
    } //and catch any other relevant exceptions here, like System.IO.FileNotFoundException 
}