- PR -

XMLの子テーブルにデータを追加したい

1
投稿者投稿内容
kyoro
会議室デビュー日: 2002/10/11
投稿数: 13
お住まい・勤務地: 大阪
投稿日時: 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でデータ追加ができず、困っております。
どなたか、アドバイスいただけますでしょうか?
どうぞよろしくお願い申し上げます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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の作り方を、そっちで聞くのもいいかも。
#家からなので資料がないの。ゴメンね。
kyoro
会議室デビュー日: 2002/10/11
投稿数: 13
お住まい・勤務地: 大阪
投稿日時: 2003-09-22 23:32
Jittaさん、早速のアドバイスありがとうございます。

一応、列Cはunboundedを設定して、別テーブルにしております。
子列Zに関しては、unboundedを定義しているだけです。

なんせ、.NETのXMLスキーマのツールでビジュアル的に
作っているだけなので、定義の基本をよくわかっていません。
DataSetなら、賢く処理できるだろうと思って始めたのですが、
早くもつまずいてしまいました。
DataSetの列にTable型があればうまくいきそうなんですが。

現在、DOMでゴリゴリガリガリやっています。
きっと、XMLってもっと便利な物なんだろうな〜、と思いつつ・・・。
(使い方をわかっていないもので。)

明日はXMLの本でも買って、お勉強するつもりです。
XMLの会議室にデビュー(?)するのは、もう少しお勉強してからにします(恥)
本当にありがとうございました!
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-09-23 00:15
引用:

kyoroさんの書き込み (2003-09-22 23:32) より:

なんせ、.NETのXMLスキーマのツールでビジュアル的に
作っているだけなので、定義の基本をよくわかっていません。
DataSetなら、賢く処理できるだろうと思って始めたのですが、
早くもつまずいてしまいました。
DataSetの列にTable型があればうまくいきそうなんですが。


 う〜ん?DataSetは…リレーショナルデータベースなので、XMLのデータ構造がそのまま再現できるわけではありません。kyoroさんのおっしゃるものは、正規化してリレーショナルをうまく使わないと、DataSetでは表現できません。XMLのままツリー構造で扱うのか、DataSetでスプレッドシートのように扱うのか、データアクセスの仕方から考えた方が良くないですか?
kyoro
会議室デビュー日: 2002/10/11
投稿数: 13
お住まい・勤務地: 大阪
投稿日時: 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で実装してしまいました。
また、チャレンジしたいと思います。

お返事遅くなり、申し訳ございませんでした。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-09-25 10:57
引用:

kyoroさんの書き込み (2003-09-25 10:36) より:

おそらく、この子テーブルをもっている列名と、
子テーブルをMappingさせることが可能だと思うんですが、
まだ分かっていません。


 「DataColumn.Table」とか?
引用:

DataColumn プロパティ より:
Table … 列が属する DataTable を取得します。

kyoro
会議室デビュー日: 2002/10/11
投稿数: 13
お住まい・勤務地: 大阪
投稿日時: 2003-09-25 11:21
Jittaさん、早速のアドバイスありがとうございます。
DataColumnにTableがあるんですか!
調査不足でした。
早速試してみます!
1

スキルアップ/キャリアアップ(JOB@IT)