xsdによるクラスの自動生成。自動生成で対応できないクラスを調整する。(2次元配列のメンバー)

xsdツールで自動生成したクラスをXMLSerializerで読み込もうとした場合に例外が発生するケースがあります。これはXSDが対応できていないタイプのXMLです。


Message="一時クラスを生成できません (result=1)。\r\nerror CS0030:
型 'XMLAttributeTest.Company.CompanyMembersMember[]' を型 'XMLAttributeTest.Company.CompanyMembersMember' に変換できません。\r\n
error CS0029: 型 'XMLAttributeTest.Company.CompanyMembersMember' を型 'XMLAttributeTest.Company.CompanyMembersMember[]' に暗黙的に変換できません。\r\n"

上のような例外エラーが発生するケースはxsdツールで、xml→xsd→C#コードと変換していった際に、変換した結果が


private CompanyMembersMember[][] membersField;
などと2次元配列になるケースです。

具体的に掘り下げて見たときに、このケースが発生するXMLとXSDは以下となります。

XML




tekk
System Engineer


tekk sister
teacher



XSD































注目する箇所はXSDの箇所で、maxOccursがunboundedとなっています。


これは、Membersタグが複数回繰り返されるXMLに対応するためのものですが、XMLの構造上Membersタグは繰り返し不要と考えられます。以下はMembersタグを複数回組み合わせたXMLになっていますが恐らくこの形式は誤りと考えられます。XSDはXML構造での繰り返し回数を1と制限しないで、複数回繰り返されるものとしてXSDを作成しようとするのでXSDで作成したXSDファイルが意図した形式になっているか確認をしてからクラスファイルに変換するようにすると使い勝手が上がると考えられます。




tekk
System Engineer


tekk sister
teacher




tekk
System Engineer


tekk sister
teacher



対策としては、xsdのmaxOccursを1に設定して、2次元配列として構成されないよう設定した上でもう一度xsdツールを実行する。その結果、1次元配列で設定されたC#コードが生成される。