UIのフォームのシリアル化されたインスタンスを表すXMLファイルがあります。このフォームはユーザーによって設計され、他のユーザーがフォームに入力できるようにします。フォームが保存されると、インスタンスデータがデータベースの列にシリアル化されます。このインスタンスデータを呼び出しています。解析する必要がありますが、C#標準の逆シリアル化を使用した逆シリアル化で問題が発生しています。これは、ユーザーに関する限り1つのフォームですが、インスタンスデータは実際には「サブフォーム」で構成されています。これらは、ユーザーに表示されるフォームで構成されているフォームです。
XMLドキュメントの形式は次のとおりです。
<Thing>
<TheSections>
<TheSection>
<TheForms>
<TheForm name="SomeUserForm">
<Property name="BackgroundColor"/>
<Control name="GroupHeading1" type="header" hasdata="N">
<Control name="GroupHeading2" type="subheader" hasdata="N">
<Control name="TextEntry1" type="detail" hasdata="Y">
<Property name="ValueField">I want to order 3 of these</Property>
<Property name="Type">TextField</Property>
</Control>
</Control>
</Control>
</Form>
<Form>....</Form>
<Form>....</Form>
<Form>....</Form>
</TheForms>
</TheSection>
<TheSection>...</TheSection>
</TheSections>
</Thing>
ご覧のとおり、コントロールは他のコントロールにネストでき、プロパティはコントロールの一部です。
フォームレベルまで逆シリアル化を行っていますが、コントロールを逆シリアル化しようとすると壊れます。
このファイルにネストされたコントロールは、私にとって重要ではありません。階層とそのすべてのプロパティに関係なく、すべてのコントロールの1つのレベルのコレクションを取得しようとしているためです。コントロールにプロパティを追加して、コントロールの親の名前が存在する場合はそれを示しますが、それ以外は、コントロールとそのプロパティのフラットなコレクションを持つオブジェクトが必要です。
階層に関係なく、コントロールがすべて同じレベルにあるかのように逆シリアル化でこのXMLを確認し、すべてのネストを自動的に逆シリアル化する方法はありますか?
ヒントをありがとう!
Visual Studio 2008のXMLファイルから生成されたXSDは次のとおりです(ご覧のとおり、元のXMLには、各フォームの上にフォームがないか、各セクションの上にセクションがありません。XMLをロードするときに追加します。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Thing">
<xs:complexType>
<xs:sequence>
<xs:element name="TheSection">
<xs:complexType>
<xs:sequence>
<xs:element name="TheForm">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Control">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="Group">
<xs:complexType>
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="GroupItem">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="taborder" type="xs:unsignedByte" use="required" />
<xs:attribute name="posneg" type="xs:string" use="required" />
<xs:attribute name="qualifier" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="render" type="xs:string" use="required" />
<xs:attribute name="size" type="xs:unsignedByte" use="required" />
<xs:attribute name="indent" type="xs:string" use="required" />
<xs:attribute name="newline" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Control">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="Property">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="hasdata" type="xs:string" use="required" />
<xs:attribute name="type" type="xs:string" use="required" />
<xs:attribute name="font" type="xs:string" use="required" />
<xs:attribute name="size" type="xs:unsignedByte" use="required" />
<xs:attribute name="indent" type="xs:string" use="required" />
<xs:attribute name="bold" type="xs:string" use="required" />
<xs:attribute name="bullet" type="xs:string" use="required" />
<xs:attribute name="newline" type="xs:string" use="required" />
<xs:attribute name="render" type="xs:string" use="required" />
<xs:attribute name="forceparagraph" type="xs:string" use="required" />
<xs:attribute name="startnewsentence" type="xs:string" use="required" />
<xs:attribute name="commadelimited" type="xs:string" use="required" />
<xs:attribute name="qualifier" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="RenderText" type="xs:string" />
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="hasdata" type="xs:string" use="required" />
<xs:attribute name="type" type="xs:string" use="required" />
<xs:attribute name="font" type="xs:string" use="required" />
<xs:attribute name="size" type="xs:unsignedByte" use="required" />
<xs:attribute name="indent" type="xs:string" use="required" />
<xs:attribute name="bold" type="xs:string" use="required" />
<xs:attribute name="bullet" type="xs:string" use="required" />
<xs:attribute name="newline" type="xs:string" use="required" />
<xs:attribute name="render" type="xs:string" use="required" />
<xs:attribute name="forceparagraph" type="xs:string" use="required" />
<xs:attribute name="startnewsentence" type="xs:string" use="required" />
<xs:attribute name="commadelimited" type="xs:string" use="required" />
<xs:attribute name="qualifier" type="xs:string" use="required" />
<xs:attribute name="headinglevel" type="xs:unsignedByte" use="required" />
<xs:attribute name="normalgroup" type="xs:string" use="required" />
<xs:attribute name="renderwithdata" type="xs:string" use="required" />
<xs:attribute name="grouptype" type="xs:string" use="required" />
<xs:attribute name="label" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:string" use="required" />
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="type" type="xs:string" use="required" />
<xs:attribute name="font" type="xs:string" use="required" />
<xs:attribute name="size" type="xs:unsignedByte" use="required" />
<xs:attribute name="indent" type="xs:string" use="required" />
<xs:attribute name="bold" type="xs:string" use="required" />
<xs:attribute name="bullet" type="xs:string" use="required" />
<xs:attribute name="newline" type="xs:string" use="required" />
<xs:attribute name="forceparagraph" type="xs:string" use="required" />
<xs:attribute name="startnewsentence" type="xs:string" use="required" />
<xs:attribute name="commadelimited" type="xs:string" use="required" />
<xs:attribute name="qualifier" type="xs:string" use="required" />
<xs:attribute name="render" type="xs:string" use="required" />
<xs:attribute name="rendercount" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="type" type="xs:string" use="required" />
<xs:attribute name="id" type="xs:unsignedByte" use="required" />
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="render" type="xs:string" use="required" />
<xs:attribute name="font" type="xs:string" use="required" />
<xs:attribute name="size" type="xs:unsignedByte" use="required" />
<xs:attribute name="indent" type="xs:string" use="required" />
<xs:attribute name="bold" type="xs:string" use="required" />
<xs:attribute name="bullet" type="xs:string" use="required" />
<xs:attribute name="newline" type="xs:string" use="required" />
<xs:attribute name="forceparagraph" type="xs:string" use="required" />
<xs:attribute name="rendercount" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
これは、逆シリアル化に使用しているクラスの例です。
[ XmlRoot("Section")
]
public class MySectionData
{
private MyFormData[] _Forms = new MyFormData[0];
[ XmlArray("Forms")
]
[ XmlArrayItem("Form")
]
public MyFormData[] Forms
{
set
{
this._Forms = value;
}
get
{
return this._Forms;
}
}
[ XmlAttribute("id")
]
public String Id
{
set;
get;
}
[XmlAttribute("name")
]
public String name
{
set;
get;
}
}