質問

任意のXMLファイルが特定のスキーマと一致するかどうかをテストしたい(trueまたはfalse)。

それが価値があることについては、スキーマは2003 WordMLスキーマという言葉であり、Microsoftは約7のリストを使用して定義しています *.xsd ファイル。

これらのファイルの1つには、W3Cも含まれています xml.xsd 次のステートメントを含めることにより、ファイル:

<xsd:import id="xml" namespace="http://www.w3.org/XML/1998/namespace"
    schemaLocation="http://www.w3.org/2001/xml.xsd"></xsd:import>

検証を行うために、次のような.NETコードを使用しています。

   public static void validate(string filename)
    {
       XmlReaderSettings settings = new XmlReaderSettings();
       settings.Schemas.Add(
           "http://schemas.microsoft.com/office/word/2003/wordml",
           //to get this file I downloaded "Office 2003: XML Reference Schemas", i.e. "Office2003XMLSchema.exe" 
           @"C:\Program Files\Microsoft Office 2003 Developer Resources\Microsoft Office 2003 XML Reference Schemas\WordprocessingML Schemas\wordnet.xsd"
           );
        settings.ValidationType = ValidationType.Schema;
        settings.ValidationEventHandler += new ValidationEventHandler(validationEventHandler);
        XmlReader xmlReader = XmlReader.Create(filename, settings);
        while (xmlReader.Read()) { }
   }

私の問題は、インターネットに接続されていないマシンでこのコードを実行すると、 XmlSchemaValidationException 見つからない効果へのエラー xml.xsd.

これを修正するために、xml.xsdのコピーをダウンロードし、次のように明示的に追加しました settings.Schemas.Add 方法:マシンがインターネットに接続されていない場合、検証は正しく機能します。

しかし、マシンがインターネットに接続されているとき、私は今、それを言っているエラーが発生しました The global attribute 'http://www.w3.org/XML/1998/namespace:lang' has already been declared..

したがって、マシンがインターネットから静かにダウンロードできるかどうかに応じて、明示的に追加する必要があるかどうか(または以前にダウンロードできた可能性があり、どこかにキャッシュされています)。

ですから、「もし私がそうするなら、私がそうしないなら、のろうした」です。 1つの方法で試して、例外をキャッチしてから、逆の方法で試してみる必要がありますか?それとも、もっとエレガントなソリューションはありますか?

役に立ちましたか?

解決

私たちはあなたのコードを見ることができませんが、 多くの実装では、カタログリゾルバーを使用して.xsdのリクエストをローカルコピーにリダイレクトすることにより、これは処理されます。プロパティがあります xmlreadersettings.xmlResolver これには使用できます。見る xmlcatalog.net Apacheライセンスの実装では、使用できます。

これの副作用は、すべてのスキーマをローカルにキャッシュしておくことができるということです。 W3Cは彼らのサイトへの過度の読み取りをブロックし、ランダムにコード(またはさらに悪いことに、顧客のコード)が失敗し始めるため、これは特に重要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top