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

  • 質問

  • 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は使用していません。

    2007年5月29日 2:24

すべての返信

  • DatasetのReadXmlメソッドを使えばよいのでは。

    ただ、ご提示のXMLはルート要素がないためDatasetにうまく展開されないと思います。

    ルート要素を付けてみてください。

    VisualStudioでXMLを開くと、下の方に「XML」「データ」ってでますよね。XMLが正しく構造化されていれば、「データ」の方のデータテーブルの欄にOrderDetailとProductという名前が表示されるでしょう。

     

    ProductIDでのデータ抽出は、DataTableのSelectメソッドとかを使えばよいのではないでしょうか。
    2007年5月29日 4:10
  • Visual StudioでXMLを開いて「データ」タグを開いたときに「データ テーブル」に表示される各項目ですが、

    DataSetのReadXmlメソッドでXMLファイルを読み込むと、

    この「データ テーブル」に表示されているテーブル分、

    DataSetの中にTableが存在するというイメージでいいのでしょうか。

    もっとも、表示されているテーブルは階層が考慮されていないようですが(右側のデータで階層が確認出来る)

    例で挙げたXMLのトップに"Root"というタグを設けると、確かにVisual Studioで表示できました。

    この場合、ReadXmlメソッドでこのXMLファイルをDataSetへセットすると、

    DataSetにOrderDetailとProductというテーブルが存在するイメージになるということでしょうか。

    2007年5月31日 7:05
  •  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" ?>
    <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>

    このXML文書をReadXmlすれば、"OrderDetail"と"Product"というTableNameの2つのDataTableができます。そして、OrderDetailには3つのDataRow、Productには2つのDataRowができます。
    2007年5月31日 9:28
  • かめたろさん、

     

    わかりやすい解説ありがとうございました。

     

    階層云々・・・の部分は次のような場合を言おうとしました。

    <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"があると思っているのですが、

    間違いないでしょうか・・・

     

    2007年6月1日 4:22
  •  msdn.bambino さんからの引用

    この場合、XML文書をReadXmlすると、OrderDetailとCustomerInfoとProductの3つのテーブルが出来ると思われます。

    はい、そうです。

     

     msdn.bambino さんからの引用

    ただ、"OrderDetail"のDataRowとして"CustomerInfo"があると思っているのですが、

    間違いないでしょうか・・・ 

    うーん、間違っているかと。DataRelationが生成されます。ReadXml後のDataSetのRelationsプロパティを確認してみてください。

    2007年6月1日 8:37