質問者
XML内の違うタグ情報を1つのDataSetの中に別々のTableとして格納する方法

質問
-
XMLファイルを読み込んで、DataSetにデータを取り込む際、
タグごとにテーブル管理したいと思っています。
XML例:
<OrderDetail>
<OrderID>1</OrderID>
<ProductID>1</ProductID>
<Amount>3</Amount>
</OrderDetail>
<OrderDetail>
<OrderID>1</OrderID>
<ProductID>2</ProductID>
<Amount>4</Amount>
</OrderDetail>
<OrderDetail>
<OrderID>2</OrderID>
<ProductID>1</ProductID>
<Amount>2</Amount>
</OrderDetail>
<Product>
<ProductID>1</ProductID>
<ProductName>Office</ProductName>
</Product>
<Product>
<ProductID>2</ProductID>
<ProductName>.Net 2003</ProductName>
</Product>これをOrderDetailテーブルとProductテーブルとして同じDataSetに格納したいのですが、今ひとつ方法がわかりません。
また、テーブルに取り込んだ後、それぞれのテーブルからProductIDをキーに情報を取得する方法はどうしたらよいのでしょうか。
開発環境は、Visual Basic .Net 2003 で、SQL Serverは使用していません。
すべての返信
-
Visual StudioでXMLを開いて「データ」タグを開いたときに「データ テーブル」に表示される各項目ですが、
DataSetのReadXmlメソッドでXMLファイルを読み込むと、
この「データ テーブル」に表示されているテーブル分、
DataSetの中にTableが存在するというイメージでいいのでしょうか。
もっとも、表示されているテーブルは階層が考慮されていないようですが(右側のデータで階層が確認出来る)
例で挙げたXMLのトップに"Root"というタグを設けると、確かにVisual Studioで表示できました。
この場合、ReadXmlメソッドでこのXMLファイルをDataSetへセットすると、
DataSetにOrderDetailとProductというテーブルが存在するイメージになるということでしょうか。
-
R.Kume さんからの引用 もっとも、表示されているテーブルは階層が考慮されていないようですが(右側のデータで階層が確認出来る)
すみませんが、意図がわかりませんでした。例のXMLはテーブルの階層になっていないですよね。
R.Kume さんからの引用 例で挙げたXMLのトップに"Root"というタグを設けると、確かにVisual Studioで表示できました。
例のXMLのままだと、XMLドキュメント(文書)というよりは、ノードの集合というかXMLフラグメント(断片)ですよね。
ヘルプには、「ReadXml メソッドを使用すると、XML ドキュメントから DataSet に、データだけ、またはデータとスキーマの両方を読み込むことができます。」とあります。
R.Kume さんからの引用 この場合、ReadXmlメソッドでこのXMLファイルをDataSetへセットすると、
DataSetにOrderDetailとProductというテーブルが存在するイメージになるということでしょうか。
<?xml version="1.0" encoding="utf-8" ?>
このXML文書をReadXmlすれば、"OrderDetail"と"Product"というTableNameの2つのDataTableができます。そして、OrderDetailには3つのDataRow、Productには2つのDataRowができます。
<root>
<OrderDetail>
<OrderID>1</OrderID>
<ProductID>1</ProductID>
<Amount>3</Amount>
</OrderDetail>
<OrderDetail>
<OrderID>1</OrderID>
<ProductID>2</ProductID>
<Amount>4</Amount>
</OrderDetail>
<OrderDetail>
<OrderID>2</OrderID>
<ProductID>1</ProductID>
<Amount>2</Amount>
</OrderDetail>
<Product>
<ProductID>1</ProductID>
<ProductName>Office</ProductName>
</Product>
<Product>
<ProductID>2</ProductID>
<ProductName>.Net 2003</ProductName>
</Product>
</root> -
かめたろさん、
わかりやすい解説ありがとうございました。
階層云々・・・の部分は次のような場合を言おうとしました。
<root>
<OrderDetail>
<OrderID>1</OrderID>
<ProductID>1</ProductID>
<Amount>3</Amount>
<CustomerInfo>
<CustomerNo>1</CustomerNo>
<Address>xxxxx</Address>
<Phone>1234-5678</Phone>
</CustomerInfo>
<CustomerInfo>
<CustomerNo>2</CustomerNo>
<Address>yyyy</Address>
<Phone>1234-7890</Phone>
</CustomerInfo>
</OrderDetail>
<Product>
<ProductID>1</ProductID>
<ProductName>Office</ProductName>
</Product>
<Product>
<ProductID>2</ProductID>
<ProductName>.Net 2003</ProductName>
</Product>
</root>これを、Visual Studioで表示すると、データテーブルの部分に、
OrderDetailとCustomerInfoとProductが並列に表示されます。
データの方では、OrderDetailを表示すると、データの行の先頭に+が表示されて、
CustomerInfoが表示されます。
・・・ということでした。
この場合、XML文書をReadXmlすると、OrderDetailとCustomerInfoとProductの3つのテーブルが出来ると思われます。
ただ、"OrderDetail"のDataRowとして"CustomerInfo"があると思っているのですが、
間違いないでしょうか・・・
-