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