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