- - PR -
XMLの子テーブルにデータを追加したい
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-09-22 21:25
XML初心者です。
C#で開発中で、XMLをDataSetで読み書きしています。 さて、そこで子テーブルにデータを追加するには、どうしたら良いの? という問題にぶつかりました。 リレーション、というものではなく、ただある列に限って、複数行許可したい ために、子テーブルという形にしました。 --------------------XMLスキーマ--------------------- <xs:element name="親テーブル" maxOccurs="1" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="列A" type="xs:integer" /> <xs:element name="列B" type="xs:boolean" /> <xs:element name="列C" maxOccurs="2" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="子列X" type="xs:long" /> <xs:element name="子列Y" type="xs:long" /> <xs:element name="子列Z" type="xs:long" maxOccurs="unbounded" minOccurs="0" /> </xs:sequence> <xs:attribute name="タイプ" type="xs:integer" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> ---------------------------------------------------------- 列Cは複数データが可能で、内部が子テーブルになっています。 また、列Zも複数データが可能です。 これでは、DataSetのNewRowでデータ追加ができず、困っております。 どなたか、アドバイスいただけますでしょうか? どうぞよろしくお願い申し上げます。 | ||||||||
|
投稿日時: 2003-09-22 22:52
つまり、こんなテーブル?
列A|列B|列C −−−−−−−−−−−−−−−−− □□|□□|子列X|子列Y|子列Z←□はスペーサ −−−−−−−−−−−−−−−−− A1|B1|CX1|CY1|CZ1 □□|□□|□□□|□□□|CZ2 □□|□□|CX2|CY2|CZ3 こういうものは、データベースを作るときに「正規化」と言って、テーブルを分けてリレーションを張るように作るか、XMLなので階層化します。 XMLの本を見ると、DOMでこういう表を定義する方法が載っています。もし、そういう本を持っていないのなら、まず用意しましょう。 あと、XMLの会議室もあるので、C#ではなく、DOMの作り方を、そっちで聞くのもいいかも。 #家からなので資料がないの。ゴメンね。 | ||||||||
|
投稿日時: 2003-09-22 23:32
Jittaさん、早速のアドバイスありがとうございます。
一応、列Cはunboundedを設定して、別テーブルにしております。 子列Zに関しては、unboundedを定義しているだけです。 なんせ、.NETのXMLスキーマのツールでビジュアル的に 作っているだけなので、定義の基本をよくわかっていません。 DataSetなら、賢く処理できるだろうと思って始めたのですが、 早くもつまずいてしまいました。 DataSetの列にTable型があればうまくいきそうなんですが。 現在、DOMでゴリゴリガリガリやっています。 きっと、XMLってもっと便利な物なんだろうな〜、と思いつつ・・・。 (使い方をわかっていないもので。) 明日はXMLの本でも買って、お勉強するつもりです。 XMLの会議室にデビュー(?)するのは、もう少しお勉強してからにします(恥) 本当にありがとうございました! | ||||||||
|
投稿日時: 2003-09-23 00:15
う〜ん?DataSetは…リレーショナルデータベースなので、XMLのデータ構造がそのまま再現できるわけではありません。kyoroさんのおっしゃるものは、正規化してリレーショナルをうまく使わないと、DataSetでは表現できません。XMLのままツリー構造で扱うのか、DataSetでスプレッドシートのように扱うのか、データアクセスの仕方から考えた方が良くないですか? | ||||||||
|
投稿日時: 2003-09-25 10:36
Jittaさん、色々とアドバイスありがとうございます。
************************************** //スキーマをデータセットに読み込み DataSet ds =new DataSet(); string xsdFileName = @"D:\Test.xsd"; FileStream FsXSD = new FileStream(xsdFileName,FileMode.Open); XmlTextReader xtrXSD = new XmlTextReader(FsXSD); ds.ReadXmlSchema(xtrXSD); xtrXSD.Close(); sXSD.Close(); //データセット内のリレーション定義を確認 string strRowVals = ""; foreach (DataRelation myRel in ds.Relations){ foreach(DataColumn col in myRel.ChildTable.Columns){ strRowVals += col.ColumnName + " "; } } ************************************** 上記のような方法で、既存のスキーマをデータセットに取得し、 リレーションが設定されているかどうかチェックすると、 子テーブルをもっている列名が取得できます。 おそらく、この子テーブルをもっている列名と、 子テーブルをMappingさせることが可能だと思うんですが、 まだ分かっていません。 時間がないため、今回はDOMで実装してしまいました。 また、チャレンジしたいと思います。 お返事遅くなり、申し訳ございませんでした。 | ||||||||
|
投稿日時: 2003-09-25 10:57
「DataColumn.Table」とか?
| ||||||||
|
投稿日時: 2003-09-25 11:21
Jittaさん、早速のアドバイスありがとうございます。
DataColumnにTableがあるんですか! 調査不足でした。 早速試してみます! |
1