2016-04-22 5 views
0

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(); 
} 

予想される出力:最初のスキーマがChild1Child2をサポートして、どちらも検証する必要があり、第二スキーマがChild1Child3をサポートしています。

CreateXsd,CreateXDoc、およびValidateには、チュートリアルのコードが含まれています。私が渡したintは、二番目のChild要素に追加されるので、何が渡されたかに応じて、Child1Child2または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つのファイルを検証できますか?

答えて

1

私はtargetNamespaceの両方の時刻として ""を指定しているため、失敗すると思います。あなたはまだこのプロジェクトを開発しているように聞こえるので、今はちょっと論理を打ち破って「ショーのためにパッチを当てる」ことができます。

P.S.上記のコードでtargetNameSpaceとして ""の代わりにnull値を渡すこともできます。おそらくそれもうまくいくでしょう!

static void Main(string[] args) 
{ 
    string xsdMarkup1 = CreateXsd(2); 
    string xsdMarkup2 = CreateXsd(3); 

    XmlSchemaSet schemas1 = new XmlSchemaSet(); 
    schemas1.Add("", XmlReader.Create(new StringReader(xsdMarkup1))); 
    XmlSchemaSet schemas2 = new XmlSchemaSet(); 
    schemas2.Add("", XmlReader.Create(new StringReader(xsdMarkup2))); 

    XDocument doc1 = CreateXDoc(2); 
    XDocument doc2 = CreateXDoc(3); 

    Validate(doc1, schemas1); 
    Validate(doc1, schemas2); 
    Validate(doc2, schemas1); 
    Validate(doc2, schemas2); 

    Console.ReadLine(); 
} 
+0

これはうまくいくかもしれませんが、私はすぐにそれを試してみます。しかし、 'XmlSchema'と' XmlSchemaSet'の違いは何ですか?私は後者が 'XmlSchema'オブジェクトのコレクションのために、一種のコンテナであると思うでしょうか?私はあなたが基本的に個別に検証するためにいくつかのスキーマを格納できると考えました。私が検証したい各スキーマに対して個別のSetオブジェクトを作成しなければならないのは、直感的ではないようです... – sab669

+0

""をtargetNamespaceとして2回指定するため、あなたが壊れていると思います。 https://msdn.microsoft.com/en-us/library/1hh8b082(v=vs.110).aspx – montewhizdoh

+0

これは動作します。私はなぜそれをしなければならないのか理解できませんが、それがうまくいくなら、それはすべて重要です。空の引用符(またはnull)は、XSD自体で定義された名前空間を使用するよう強制します。この場合、同じw3.org URLを使用しています。 – sab669

関連する問題