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

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

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

DataSetは、ADO.NETアーキテクチャのコンポーネントです。データベースから取得したレコードをメモリ領域に格納するクラスを指します。データの保持やテーブル間のリレーション・制約といった保持も可能です。

XML

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XSD

XSDは一般的に、XMLドキュメントの特定のタイプの表現を含んだ、W3C XML Schemaフォーマットで書かれたドキュメントを指します。

Q&A

解決済

2回答

8791閲覧

C#でXSDからDataSetを利用したXML作成について

hironobu_

総合スコア6

DataSet

DataSetは、ADO.NETアーキテクチャのコンポーネントです。データベースから取得したレコードをメモリ領域に格納するクラスを指します。データの保持やテーブル間のリレーション・制約といった保持も可能です。

XML

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XSD

XSDは一般的に、XMLドキュメントの特定のタイプの表現を含んだ、W3C XML Schemaフォーマットで書かれたドキュメントを指します。

0グッド

0クリップ

投稿2018/12/20 06:50

編集2018/12/21 06:45

##問題点
Visual Studio 2017でC#を使い、XSD(XML Schema)をDataSetに読み込み、データを格納した上で、XMLデータとして出力するプログラムを作成しています。しかし、このXSD内で階層が3階層以上になると、作成されるXMLの階層がXSDの通りにならないという問題が発生しています。

###XSDを文字列で読み込み、DataSetにセットした上で、Tablesの各テーブルにデータを入れていく処理

xsd

1<?xml version="1.0" encoding="utf-8"?> 2<xs:schema id="XMLSchema_201812111740_B" 3 elementFormDefault="qualified" 4 xmlns:xs="http://www.w3.org/2001/XMLSchema" 5 xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 6 <xs:element name="施設" msdata:IsDataSet="true"> 7 <xs:complexType> 8 <xs:sequence> 9 <xs:element name="施設情報" minOccurs="0" maxOccurs="1"> 10 <xs:complexType> 11 <xs:sequence> 12 <xs:element name="基本情報" minOccurs="0" maxOccurs="1"> 13 <xs:complexType> 14 <xs:sequence> 15 <xs:element name="科目" minOccurs="0" maxOccurs="1"> 16 <xs:complexType> 17 <xs:sequence> 18 <xs:element name="その他" minOccurs="0" maxOccurs="1"> 19 <xs:complexType> 20 <xs:sequence> 21 <xs:element name="その他" type="xs:string" /> 22 </xs:sequence> 23 </xs:complexType> 24 </xs:element> 25 </xs:sequence> 26 </xs:complexType> 27 </xs:element> 28 </xs:sequence> 29 </xs:complexType> 30 </xs:element> 31 </xs:sequence> 32 </xs:complexType> 33 </xs:element> 34 </xs:sequence> 35 </xs:complexType> 36 </xs:element> 37</xs:schema> 38

cs

1// XSDを読み込む 2var xml = new DataSet("XmlSchema"); 3xml.ReadXmlSchema(_getMemoryStream(XmlSchemaString)); // xsdを文字列で渡している 4 5// 読み込んだXSDを基にしたDataTable群にダミーのデータを格納していく 6foreach (DataTable Table in xml.Tables) 7{ 8 var row = Table.NewRow(); 9 foreach (DataColumn column in Table.Columns) 10 { 11 if (column.ColumnMapping != MappingType.Hidden) 12 { 13 row[column.ColumnName] = "test"; 14 } 15 } 16 Table.Rows.Add(row); 17} 18var xmlData = xml.GetXml();

上記記述を行った場合、xmlDataに格納される値として

xml

1<施設> 2 <施設情報 /> 3 <基本情報 /> 4 <科目> 5 <その他> 6 <その他>test</その他> 7 </その他> 8 </科目> 9</施設>

が格納されます。この形ではなく

xml

1<?xml version="1.0" encoding="utf-8"?> 2<施設> 3 <施設情報> 4 <基本情報> 5 <科目> 6 <その他> 7 <その他>test</その他> 8 </その他> 9 </科目> 10 <基本情報> 11 </施設情報> 12</施設>

というような形式をイメージしているのですが、お知恵を拝借できませんでしょうか?

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

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

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

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

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

guest

回答2

0

自己解決

自分でXSDのパーサとXSDに基づくスキーマを作成するクラスを作りましたので、解決とさせていただきたいと思います。

投稿2018/12/25 08:56

hironobu_

総合スコア6

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

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

0

DataSetは扱いづらく、重たく、バグ取りの面倒な過去の遺物です。
Xsd.exeを使ってxsdからクラスを生成し、そのクラスをプロジェクトに追加して使って下さい。
生成したクラスのオブジェクトをXmlSerializerを使ってXMLにシリアライズすることで、xsd通りのXMLが簡単に作れます。

投稿2018/12/20 08:07

hihijiji

総合スコア4152

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

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

hironobu_

2018/12/20 08:47 編集

すみません。今回の作業では、動的にXSDからインスタンスを作成し、クラスの生成なしにXMLを生成したいと考えております。また、実行環境について振れていませんでしたが、CentOS に dotnet core2.0を導入してWEBサーバー環境で動作させたいと考えていますので、Xsd.exeも利用できない状況です。 DataSetにはこだわりませんが、上記仕様となっており、インターネットで探しても該当のドキュメントが見つかりませんでしたので、質問させていただきました。何卒よろしくお願い申し上げます。
hihijiji

2018/12/20 10:25

開発環境でXsd.exeを一度だけ実行すれば、実行環境はなんであっても関係ありません。 xsdは仕様書なので、仕様書を動的に変更するようなはた迷惑な話は無いと思いますが…
hironobu_

2018/12/21 00:57

はい。おっしゃる通りXSDは仕様書ですので、変更いたしません。今回の要件ではXSDを基にデータのスキームを動的に作成し、それに対してデータを格納し、それをXMLとして出力したいという要件です。よって実行環境上で一連の動作を行いたいという形になります。 ①XSDの読み込み ②データの格納 までは問題ないのですが、そのあとの ③XMLを出力 にてXSDにて定義していた階層構造が失われ、スキームが変わってしまうという事象が発生しているというのが今回の要件です。
hihijiji

2018/12/21 02:20

XSDが固定ならスキームを動的に作成すること自体完全に無駄でしょう? それにデータを埋めるロジックは固定になるわけですから。 XSD は検証のみと割り切って XmlDocument でゴリゴリ書く方法もありますが、少なくともXML生成用途にDataSetは無いです。
hironobu_

2018/12/21 02:52

ご意見ありがとうございます。 後出しの情報で大変失礼なことは存じておりますが、追記させていただきますとXSDファイルを必要になった際に都度作成し、システムに登録することでシステム変更なしにシステム内にスキームを作ることができるようになると考えております。一旦作成したXSDは固定となります。この仕組みを取ることにより追加開発コストの削減をさせるという意図がございます。また、その後XSLTにて整形したいと考えておりますので、XMLにしたいという意図があります。 データを埋めるロジックは文字列にて項目名を指定することで埋めていくことができると考えております(検証済み)。 重ね重ねとなり、これも失礼とは存じますが、Datasetにこだわりはございません。上記方法が実現できる方法があればそれを採用する所存です。 貴重なご意見とお時間をいただき、感謝いたしております。ありがとうございました。
hihijiji

2018/12/21 06:00

要するに、「想定できる範囲で仕様変更の予定があるから予め仕様に盛り込みたい」ってことですか? それでアーキテクチャを考えていたら、XML+形無しDataSetで実現できそうだけどつまずいたと? 状況は理解できたような気がします。 手段だけでなく目的も質問に加筆したほうがいいですよ。
hironobu_

2018/12/25 09:29

私見ですが、目的はさほど関係ないように思います。怒らないで聞いていただきたいのですが、そもそもソースを読んでいただくと目的って大体見えると思います。ただ、hihijiiさんは第一回答から静的に処理する案を出されているので、前提から違っており、平行線になっている状態が続いているのです。動的に処理したいという事は、ソースから伝わるはずです。  また、これもやはり怒らずに聞いていただきたいのですが、やんわりと周辺情報を伝えると否定されたことからマウントを取り出しに来られていますが、議論に意味がありません。その証拠に、情報提示を進めても迷子になるだけで本件がクローズになりませんでした。例えばStack over flow等では端的な要件から手段の提示と案件のクローズがスマートに行われています。あくまで技術者同士ですので、ちえぶくろ的な問答は不要と考えています。 お時間とお手間と解決のためにご助力いただいたことには感謝しています。本件は既に解決となっておりますので、お返事は不要です。ありがとうございました。
hihijiji

2018/12/25 09:39

こちらこそ気を悪くされたようですみません。 私がDataSetに対して持っていた悪感情が出てしまったようです。 けして貴殿に対して思うところがあった訳ではないのですが、読み返すと突っかかってますね。 反省します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問