質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

4324閲覧

Visual Basicで、DataSetに格納したデータをXMLとして変数に格納、値を返したい

kn0ws_dev

総合スコア15

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2019/04/18 07:32

編集2019/04/18 07:50

前提・実現したいこと

Visual Basic初心者です。

Visual Basicで、MySQLから取ってきた情報をDataSetに
格納し、XMLデータとして変数に出力し、XMLデータを返したいと考えています。

現状では、ローカルフォルダに.xmlファイルを生成し、それを読み込み、XMLデータを
返すようになっていますが、この一連の流れをxmlファイルを生成せず、プログラム上
でのみ実現したいです。

現状: MySQLからデータを取る→DataSetに格納→格納されたデータをXMLとして書き込む→
書き込んだxmlファイルを読み込む→値を返す

理想: MySQLからデータを取る→DataSetに格納→格納されたデータを変数Aに書き込む→
書き込んだ変数Aを読み込む→値を返す

発生している問題・エラーメッセージ

ソースコードにある通り、出来そうなことは試してみましたが、どうしてもうまくいきません。

該当のソースコード

VB

1Public Function Func1(ByVal sql As String) As XmlDocument 2 Dim constr As String = "userid=root;password=mysql;host=localhost" 3 Dim conn As MySqlConnection = New MySqlConnection(constr) 4 Dim da As MySqlDataAdapter 5 Dim ds As DataSet 6 Dim filePath As String 7 Dim result As XmlDocument 8 Try 9 conn.Open() 10 filePath = String.Format("C:\Users\admin\Documents\data.xml") 11 da = New MySqlDataAdapter(sql, conn) 12 ds = New DataSet("user") 13 da.FillSchema(ds, SchemaType.Source, "user") 14 da.Fill(ds) 15 ds.WriteXml(filePath) 16 conn.Close() 17 Dim xdoc As New XmlDocument() 18 xdoc.Load(filePath) 19 result = xdoc 20 Catch ex As Exception 21 End Try 22 Return result 23 End Function

試したこと

VisualBasic

1Public Function Func1(ByVal sql As String) As XmlDocument 2 Dim constr As String = "userid=root;password=mysql;host=localhost" 3 Dim conn As MySqlConnection = New MySqlConnection(constr) 4 Dim da As MySqlDataAdapter 5 Dim ds As DataSet 6 'Dim filePath As String 7 Dim xmlStr As String = "" 8 Dim result As XmlDocument 9 Try 10 conn.Open() 11 'filePath = String.Format("C:\Users\admin\Documents\data.xml") 12 da = New MySqlDataAdapter(sql, conn) 13 ds = New DataSet("user") 14 da.FillSchema(ds, SchemaType.Source, "user") 15 da.Fill(ds) 16 'ds.WriteXml(filePath) 17 ds.WriteXml(xmlStr) 18 conn.Close() 19 Dim xdoc As New XmlDocument() 20 'xdoc.Load(filePath) 21 xdoc.Load(xmlStr) 'xdoc.LoadXml(xmlStr)も試しました 22 result = xdoc 23 Catch ex As Exception 24 End Try 25 Return result 26 End Function

補足情報(FW/ツールのバージョンなど)

Visual Studio 2015
ASP.NET Webサービス
.NET バージョン: 4.5.2
WebForms

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/04/18 07:37

Web Forms か MVC かどっちですか? .NET のバージョン、MVC ならそのバージョンを書いてください。
kn0ws_dev

2019/04/18 07:49

申し訳ありません。まだ触って間もない為、記述を忘れておりました。 WebFormsで、.NETのバージョンは4.5.2です。
guest

回答1

0

ベストアンサー

未検証ですが・・・

DataSet.WriteXml メソッドには引数に Stream を取るオーバーロードがありますのでそれを使って、その引数に Response.OutputStream を設定したらよさそうです。

お試しください。試してダメなら連絡ください(その際はどのように試したかの詳細情報も連絡ください)。

【追伸】

ASP.NET ということで、ブラウザでアクセスしてくるユーザーに .xml ファイルを返すと思っていましたが、違うのでしょうか?

質問に書かれたメソッドをよく見てみると XmlDocument を返してますが、ASP.NET Web アプリでユーザーにそれを返すということはないはずですけど。

ユーザーに返すものとかではではなく、内部処理の話ですか?

【追伸2】

DatSset.WriteXml メソッド、XmlDocument.Load メソッドの、引数に Stream を取るオーバーロードを使って、MemoryStream 経由で「DB からデータを取得し XmlDocument オブジェクトを生成」をオンメモリで行うサンプルです。DB は MySQL のサンプル world の country テーブルです。

コードは C# ですが読めなければ変換サービス http://converter.telerik.com/ を使ってみてください。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using System.Data.SqlClient; using System.IO; using System.Xml; using MySql.Data.MySqlClient; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { string connectionString = @"接続文字列"; string commandText = "SELECT Code, Name, Continent, SurfaceArea, IndepYear, Population " + "FROM country WHERE Region='North America'"; DataSet dataset = new DataSet(); using (MySqlConnection connection = new MySqlConnection(connectionString)) { using (MySqlCommand command = new MySqlCommand(commandText, connection)) { MySqlDataAdapter adapter = new MySqlDataAdapter(); adapter.SelectCommand = command; adapter.Fill(dataset); } } MemoryStream stream = new MemoryStream(); dataset.WriteXml(stream, XmlWriteMode.WriteSchema); XmlDocument xmlDocument = new XmlDocument(); stream.Position = 0L; xmlDocument.Load(stream); Console.WriteLine(xmlDocument.OuterXml); } } }

結果は以下の通りです。(見やすくなるよう改行とインデントを入れてます)

<NewDataSet> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Table"> <xs:complexType> <xs:sequence> <xs:element name="Code" type="xs:string" minOccurs="0" /> <xs:element name="Name" type="xs:string" minOccurs="0" /> <xs:element name="Continent" type="xs:string" minOccurs="0" /> <xs:element name="SurfaceArea" type="xs:float" minOccurs="0" /> <xs:element name="IndepYear" type="xs:short" minOccurs="0" /> <xs:element name="Population" type="xs:int" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <Table> <Code>BMU</Code> <Name>Bermuda</Name> <Continent>North America</Continent> <SurfaceArea>53</SurfaceArea> <Population>65000</Population> </Table> <Table> <Code>CAN</Code> <Name>Canada</Name> <Continent>North America</Continent> <SurfaceArea>9970610</SurfaceArea> <IndepYear>1867</IndepYear> <Population>31147000</Population> </Table> ・・・中略・・・ </NewDataSet>

投稿2019/04/18 08:04

編集2019/04/21 01:34
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kn0ws_dev

2019/04/19 00:09

アドバイス頂きありがとうございます。 今回アドバイスしていただいた内容につきまして、どの部分にどのように記述すれば良いのかが分からない為、現状では進展がありません。 もしよろしければ、ソースコードでのサンプルを頂けると幸いです。 【追伸について】 イメージが伝わりづらく、申し訳ありません。 今回の処理については、ユーザーがJavascriptで作られたフォームにSQL文を入力し、送信するとSQL文をASP.NET側で受信し、MySQLからデータを取得し、XML形式のデータにして返す、という形式です。 その為、ユーザーに返す、という事になります。 XmlDocumentを返す理由としましては、前任の方が作成しているものの為、このような形で返すのが一般的なのかと考えていました。 ユーザー側のブラウザはIEに限定しています。
退会済みユーザー

退会済みユーザー

2019/04/19 00:50

何の話なのですか? ASP.NET がホストする Web サービスをブラウザから ajax を使って呼び出し、返ってきた xml 形式のデータを JavaScript で処理してブラウザ画面に標示する? そのあたり前任者に聞いていただけませんか?
退会済みユーザー

退会済みユーザー

2019/04/19 03:01

返事がないのですが・・・ 要するに「DB からデータを取得し XmlDocument オブジェクトを生成」という操作をオンメモリ(.xml ファイルを作らずに)で出来れば質問者さんの課題は 100% 解決と理解して良いのですか?
退会済みユーザー

退会済みユーザー

2019/04/19 23:03 編集

依然として返事がありませんが、「DB からデータを取得し XmlDocument オブジェクトを生成」という操作をオンメモリで出来れば質問者さんの課題は 100% 解決と理解して・・・ 質問者さんのコードで使っている DataSet.WriteXml メソッド、XmlDocument.Load メソッドは引数に String 即ちファイルへのパスを取るものなのでファイル経由にならざるを得ません。 DataSet.WriteXml メソッド、XmlDocument.Load メソッドには引数に Stream を取るオーバーロードがあるので、それらを使えばファイル経由ではなくて MemoryStream 経由にできる、即ち「DB からデータを取得し XmlDocument オブジェクトを生成」をオンメモリでできるはずです。 お試しください。
退会済みユーザー

退会済みユーザー

2019/04/21 01:26

上に書いた「DB からデータを取得し XmlDocument オブジェクトを生成」のサンプルコードを回答欄にアップしておきます。
kn0ws_dev

2019/04/22 00:55

SurferOnWww様、ご返信が遅れてしまい申し訳ありません。 そして、素晴らしいサンプルコードをご提示頂きありがとうございます。 早速試しました所、私の理想通りの動作をしていました。 本当にありがとうございます。 わざわざお時間を頂き申し訳ありません。 本当に本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問