2009-05-01 8 views
0

XMLスキーマ文書を使用して着信データ文書を検証していますが、スキーマは外部スキーマの一部である複雑な型を参照しているため、外部スキーマは、文書の先頭にある<xs:import>要素で指定されます。私はそれがアクセスの問題かもしれないと思っていたので、私は外部のドキュメントのコピーをlocalhostフォルダに移動しました。私は同じエラーが発生するので、<xs:import>要素の使用に何らかの問題があるかどうか疑問に思っています。C#の<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> 

私はこれを実行しようとしているコードがある本当のシンプル

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()) 
{ 

} 

すべてがするまでうまくいく(http://dotnetslackers.com/Community/blogs/haissam/archive/2008/11/06/validate-xml-against-xsd-xml-schema-using-c.aspxからそれを得ました) whileループの直前でXMLReaderオブジェクトをインスタンス化する行。次に、宣言されていない型でエラーが発生します。検索しようとしている型、KeyInfoTypeは、import要素のドキュメントの1つで定義されています。私は名前空間が整列していることを確認しました。私は、名前空間定義の#記号が問題を引き起こしているのか疑問に思っていましたが、それらを削除しても何の効果もなく、エラーの様子が変わっただけです(つまり、「タイプ 'http://www.w3.org/2000/09/xmldsig:KeyInfoType'は宣言されていません。宣言しました。」)

私が紛失している<xs:import>要素の処理については疑問があります。どんな提案も大歓迎です。ありがとう!私はあなたがそれを動作させるために、コードのちょうど1行を追加する必要があると思う

答えて

0

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

マルク・

+0

私はその行を試しましたが、効果はありません。私はProcessSchemaLocationフラグを見て、私が見た複合オペレータ(私には初めての)を使った例が見つかりました: settings.ValidationFlags | = System.Xml.Schema.XmlSchemaValidationFlags.ProcessSchemaLocation; 残念ながら、それはどちらもうまくいきませんでした。私はそれを忘れてしまいます。ありがとう! – BobC

0

[OK]を、これは少し不可解なっています。私はこれを行追加するなど、いくつかの異なる方法で行うことを試みた:

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ドキュメントをコンパイルするフレームワークの機能に妙なことがあります。誰もこの行動を見たことがありますか? Googleはこの問題を実りあるものとは証明していませんが、試してみるとたくさんの提案があります。ありがとう!

関連する問題