2つのスキーマのうちの1つに一致するユーザー提供のXMLファイルが必要です。2つのXSDに対して1つのXMLファイルを検証する方法は?
私たちの「本当の」XSDさんはまだ終了していないとして、このチュートリアルに沿って、次のとおりです。私はそのチュートリアルの「逆」をしたい場合を除き
https://msdn.microsoft.com/en-us/library/bb387037.aspx
を。二xsdMarkup
がありますようにだから私はそれを修正:
static void Main(string[] args)
{
string xsdMarkup1 = CreateXsd(2);
string xsdMarkup2 = CreateXsd(3);
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup1)));
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup2)));
XDocument doc1 = CreateXDoc(2);
XDocument doc2 = CreateXDoc(3);
Validate(doc1, schemas);
Validate(doc2, schemas);
Console.ReadLine();
}
予想される出力:最初のスキーマがChild1
Child2
をサポートして、どちらも検証する必要があり、第二スキーマがChild1
、Child3
をサポートしています。
CreateXsd
,CreateXDoc
、およびValidate
には、チュートリアルのコードが含まれています。私が渡したint
は、二番目のChild
要素に追加されるので、何が渡されたかに応じて、Child1
とChild2
またはChild3
のいずれかが2番目の要素として追加されます。
私はこれを実行して、このエラーでValidate(doc1, schemas);
クラッシュ:
The global element 'Root' has already been declared.
私の2つのxsdMarkup
の変数が、それは単に最初のスキーマにスキーマを追加しています、同じxmlns
値を使用するので、それはのように思えます。 OK、問題ありません。私はちょうど2番目の名前空間を変更します...いいえ、そのURLは有効ではなく、代わりに何を代用できるのかわからないのでクラッシュします。
したがって、2つの機能スキーマがあると仮定します。 XmlSchemaSet.Add
を2回呼び出して、XDocument.Validate(myXmlSchemaSetObj, someValidationEventHandlerDefintion);
を呼び出して複数のスキーマに対して1つのファイルを検証できますか?
これはうまくいくかもしれませんが、私はすぐにそれを試してみます。しかし、 'XmlSchema'と' XmlSchemaSet'の違いは何ですか?私は後者が 'XmlSchema'オブジェクトのコレクションのために、一種のコンテナであると思うでしょうか?私はあなたが基本的に個別に検証するためにいくつかのスキーマを格納できると考えました。私が検証したい各スキーマに対して個別のSetオブジェクトを作成しなければならないのは、直感的ではないようです... – sab669
""をtargetNamespaceとして2回指定するため、あなたが壊れていると思います。 https://msdn.microsoft.com/en-us/library/1hh8b082(v=vs.110).aspx – montewhizdoh
これは動作します。私はなぜそれをしなければならないのか理解できませんが、それがうまくいくなら、それはすべて重要です。空の引用符(またはnull)は、XSD自体で定義された名前空間を使用するよう強制します。この場合、同じw3.org URLを使用しています。 – sab669