0

XMLスキーマドキュメントを使用して受信データドキュメントを検証していますが、スキーマは外部スキーマの一部である複合型を参照しているため、実行時のコンパイル中に失敗しているように見えます。外部スキーマは<xs:import>、ドキュメントの上部にある要素で指定されます。アクセスの問題かもしれないと思っていたので、外部ドキュメントのコピーをローカルホストフォルダに移動しました。<xs:import>同じエラーが発生するので、要素の使用に何らかの問題があるのではないかと考えています。

スキーマドキュメントフラグメントは次のようになります。

<xs:schema targetNamespace="http://www.smpte-ra.org/schemas/429-7/2006/CPL" xmlns:cpl="http://www.smpte-ra.org/schemas/429-7/2006/CPL" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
...  
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://localhost/TMSWebServices/XMLSchema/xmldsig-core-schema.xsd"/>
...
<xs:element name="Signer" type="ds:KeyInfoType" minOccurs="0"/>
...
</xs:schema>

私がこれを実行しようとしているコードは本当に単純です(http://dotnetslackers.com/Community/blogs/haissam/archive/2008/11/06/validate-xml-against-xsd-xml-schemaから入手してください) -using-c.aspx

string XSDFILEPATH = @"http://localhost/TMSWebServices/XMLSchema/CPL.xsd";
string XMLFILEPATH = @"C:\foo\bar\files\TestCPLs\CPL_930f5e92-be03-440c-a2ff-a13f3f16e1d6.xml";

System.Xml.XmlReaderSettings settings = new System.Xml.XmlReaderSettings();
settings.Schemas.Add(null, XSDFILEPATH);
settings.ValidationType = System.Xml.ValidationType.Schema;

System.Xml.XmlDocument document = new System.Xml.XmlDocument();
document.Load(XMLFILEPATH);

System.Xml.XmlReader rdr = System.Xml.XmlReader.Create(new StringReader(document.InnerXml), settings);
while (rdr.Read()) 
{ 

}

whileループの直前にXMLReaderオブジェクトをインスタンス化する行まで、すべてがうまくいきます。次に、タイプが宣言されていないエラーで失敗します。検索しようとしているタイプKeyInfoTypeは、import要素のドキュメントの1つで定義されています。名前空間が揃っていることを確認しました。名前空間定義の#記号が問題の原因であるかどうか疑問に思いましたが、それらを削除しても効果はなく、エラーの外観が変更されました(つまり、「タイプ」http://www.w3.org/2000/09/xmldsig :KeyInfoType 'は宣言されていません。"対" Type'http://www.w3.org/2000/09/xmldsig#: KeyInfoType 'は宣言されていません。")

<xs:import>私の疑いは、私が欠けている要素の処理について何かがあるということです。どんな提案でも大歓迎です。ありがとう!

4

2 に答える 2

0

わかりました、これは少し困惑しています。行を追加するなど、いくつかの異なる方法でこれを実行しようとしました。

settings.ValidationFlags |= System.Xml.Schema.XmlSchemaValidationFlags.ProcessSchemaLocation;

そして私は同じエラーを受け取り続けます:

Type 'http://www.w3.org/2000/09/xmldsig#:KeyInfoType' is not declared.

その名前空間で指定されたドキュメントは次のとおりです。

http://localhost/TMSWebServices/XMLSchema/xmldsig-core-schema.xsd

私がいる場所からドキュメントにアクセスでき、152行目で(一見)問題のあるKeyInfoTypeタイプを見つけることができます。

楽しみのために、検証中のドキュメントを調べたところ、このタイプのスキーマで定義されている要素がドキュメントにないことがわかりました。スキーマはそれをオプション(minOccurs = "0")として定義しているので、それは問題ではありません。

schmeaドキュメントが外部スキーマドキュメントをインポートするときに、そのドキュメントをコンパイルするフレームワークの機能に何か奇妙なことがあるかのようです。誰かがこの行動を見たことがありますか?グーグルはこの問題に対して実りあることを証明していませんが、それは私に試してみるべきたくさんの提案を与えてくれました。ありがとう!

于 2009-05-08T17:42:21.770 に答える
0

それを機能させるには、1行のコードを追加する必要があると思います。

settings.ValidationFlags =  
      System.Xml.Schema.XmlSchemaValidationFlags.ProcessSchemaLocation;

マーク

于 2009-05-01T20:56:28.593 に答える