C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: XMLスキーマの使い方について


(過去ログ 149 を表示中)

[トピック内 17 記事 (1 - 17 表示)]  << 0 >>

■87055 / inTopicNo.1)  XMLスキーマの使い方について
  
□投稿者/ MTK (43回)-(2018/04/09(Mon) 16:42:53)

分類:[C#] 

お世話になります。

C#でxmlを作成してサイトへ送信するプログラムを作成しています。
送信先サイトからxmlスキーマを取得しましたが、これはどのように使用したらいいのでしょうか?

調べてみると、xmlを作るにあたってのルールが記載されているということは分かりました。
xmlスキーマの中身も見て、ルールもある程度理解はできましたが、
テキストエディタ等でスキーマを見ながらxmlを作るというのが本来の使い方なのでしょうか?

それともプログラムでスキーマを読み込んで、整合性チェックなどを行えるものなのでしょうか?
どのように使ったら良いかが分かりません。
ご存じの方がおられたら教えて頂きたいです。
引用返信 編集キー/
■87056 / inTopicNo.2)  Re[1]: XMLスキーマの使い方について
□投稿者/ 魔界の仮面弁士 (1632回)-(2018/04/09(Mon) 17:02:05)
No87055 (MTK さん) に返信
> 送信先サイトからxmlスキーマを取得しましたが、
> これはどのように使用したらいいのでしょうか?
とりあえずそれを、拡張子 .xsd とすれば、Visual Studio で開けるようになります。
DataSet で使われているのも XML Schema ですね。

ただし、全ての XML Schema が、DataSet として認識可能なわけではありません。


> それともプログラムでスキーマを読み込んで、整合性チェックなどを行えるものなのでしょうか?
はい、可能です。

XDocument を用いている場合は、こちらを参照してみてください。
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/linq/how-to-validate-using-xsd-linq-to-xml

XmlDocument や XmlReader を用いている場合は、こちらを参照してみてください。
https://docs.microsoft.com/ja-jp/dotnet/standard/data/xml/validating-an-xml-document-in-the-dom

あるいは、XmlSchemaValidator や XmlSchemaSet を使うこともできます。
https://docs.microsoft.com/ja-jp/dotnet/standard/data/xml/working-with-xml-schemas
https://docs.microsoft.com/ja-jp/dotnet/standard/data/xml/xmlschemaset-for-schema-compilation
引用返信 編集キー/
■87057 / inTopicNo.3)  Re[1]: XMLスキーマの使い方について
□投稿者/ WebSurfer (1460回)-(2018/04/09(Mon) 18:15:15)
No87055 (MTK さん) に返信

> C#でxmlを作成してサイトへ送信するプログラムを作成しています。
> 送信先サイトからxmlスキーマを取得しましたが、これはどのように使用したらいいのでしょうか?

Web サービス / WCF サービスと C# のクライアントアプリとの間で SOAP でやり取りするという話ですか?
引用返信 編集キー/
■87065 / inTopicNo.4)  Re[2]: XMLスキーマの使い方について
□投稿者/ MTK (44回)-(2018/04/10(Tue) 13:14:19)
No87056 (魔界の仮面弁士 さん) に返信

回答ありがとうございます。


> とりあえずそれを、拡張子 .xsd とすれば、Visual Studio で開けるようになります。
> DataSet で使われているのも XML Schema ですね。

Visual Studioで開くことができました。
DataSetは今まで使ったことがなかったのですが、メモリ上にデータベースを作ることができるようなもの?なんですかね。
XML Schemaを使っているということは、データベースの制約などが書かれているのかなと想像しています。



> はい、可能です。
>
> XDocument を用いている場合は、こちらを参照してみてください。
> https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/linq/how-to-validate-using-xsd-linq-to-xml
>
> XmlDocument や XmlReader を用いている場合は、こちらを参照してみてください。
> https://docs.microsoft.com/ja-jp/dotnet/standard/data/xml/validating-an-xml-document-in-the-dom
>
> あるいは、XmlSchemaValidator や XmlSchemaSet を使うこともできます。
> https://docs.microsoft.com/ja-jp/dotnet/standard/data/xml/working-with-xml-schemas
> https://docs.microsoft.com/ja-jp/dotnet/standard/data/xml/xmlschemaset-for-schema-compilation

こんなに色々あるんですね!
これからxmlを作成するプログラムを作ろうと思っていたところで、何を使えばいいかなど分かっておりませんでしたので助かります。
どれにも一長一短あるかと思うのですが、もし今使うならこれがいい など個人的な意見で結構ですので、オススメがあれば教えて頂けないでしょうか。

引用返信 編集キー/
■87066 / inTopicNo.5)  Re[2]: XMLスキーマの使い方について
□投稿者/ MTK (45回)-(2018/04/10(Tue) 13:26:18)
No87057 (WebSurfer さん) に返信

回答ありがとうございます。


> Web サービス / WCF サービスと C# のクライアントアプリとの間で SOAP でやり取りするという話ですか?

質問頂いた用語をぐぐってみましたが、WCFサービスやSOAPがまだ理解できておらず、今回のものがそれに該当するのか分かっていない状態です。
今回の仕様書等も見ながらもう少し勉強してみたいと思います。

今日まで調べて分かったことは、
・プログラムでxmlを作成して、指定されたURLに送る必要がある
・指定されたURLに送る際には、先方サイトが用意しているライブラリを使って送信が可能
というところまでです。
ともあれ、もっと詳しく調べなければいけませんね。
引用返信 編集キー/
■87067 / inTopicNo.6)  Re[3]: XMLスキーマの使い方について
□投稿者/ WebSurfer (1461回)-(2018/04/10(Tue) 14:05:02)
No87066 (MTK さん) に返信

> 今日まで調べて分かったことは、
> ・プログラムでxmlを作成して、指定されたURLに送る必要がある
> ・指定されたURLに送る際には、先方サイトが用意しているライブラリを使って送信が可能
> というところまでです。

既存のサービスの API にその仕様に合わせて xml データを作成し送信するということですか? 
であれば、その仕様の詳細を明確にしていただかないと的を得た答えは出せそうもないです。

ただ、そのサービスが SOAP を利用した Web サービス / WCF サービスであれば、Visual Studio
を利用してクライアントアプリを作成する際 [サービス参照の追加] を行うと、クライアント
アプリと Web サービス / WCF サービスの間をやり取りするためのプロキシクラスを生成して
くれます。

それを利用すれば、自分で xml データを作って送信したり、応答として返ってきた xml データ
をクライアントアプリで使える形にデシリアライズするということは不要です。

具体的には、以下の記事の「3. Windows クライアントで WCF サービスを利用する」のセクショ
ンを見てください。

10 行でズバリ!! [C#] WCF サービスの作成と利用
https://code.msdn.microsoft.com/windowsdesktop/10-C-WCF-a3831723

そこに書いてある手順でプロキシクラスを生成すれば、クライアントアプリからは、上記の記事
にも書いてありますが、

label1.Content = client.GetData(12345);
composite = client.GetDataUsingDataContract(composite);

のようにメソッドを呼び出すだけで、Web サービス / WCF サービスへの接続、xml データの
シリアライズ / デシリアライズ、データの送受信は全てプロキシクラスがやってくれます。

その応用で以下のようなことも可能になります。

WCF サービス経由で非接続型データアクセス
http://surferonwww.info/BlogEngine/post/2018/03/04/data-access-from-windows-forms-to-wcf-service-using-strongly-typed-dataset.aspx

ご参考まで。
引用返信 編集キー/
■87071 / inTopicNo.7)  Re[3]: XMLスキーマの使い方について
□投稿者/ 魔界の仮面弁士 (1635回)-(2018/04/10(Tue) 15:03:17)
No87065 (MTK さん) に返信
> メモリ上にデータベースを作ることができるようなもの?なんですかね。
狭義のデータベースとはちょっと異なりますが、概ねそんな感じです。

データベースを模した形のデータの入れ物というだけなので、
データベースと無関係なデータを蓄えることも出来ます。


> XML Schemaを使っているということは、データベースの制約などが書かれているのかなと想像しています。

正確には『データベースの制約』ではなく、『DataSet 自身の制約』情報ですね。

たとえば、データベース側は数値型の列だけど、DataSet は文字列型の列として、
管理させている場合もあります。また、列のデータ型なども、
データベースにとっての型ではなく、.NET にとっての型で管理されます。


【参考情報】
.NET の System.DateTime 型の範囲は 0001/01/01 00:00:00.0000000〜9999/12/31 23:59:59.9999999
SQL Server の datetime 型の範囲は 1753/01/01 00:00:00.000〜9999/12/31 23:59:59.997
Oracle の DATE 型の範囲は -4712/01/01 00:00:00〜9999/12/31 23:59:59
Access の DATE 型の範囲は 0100/01/01 00:00:00〜9999/12/31 23:59:59


> もし今使うならこれがいい など個人的な意見で結構ですので、オススメがあれば教えて頂けないでしょうか。
求められている XML 構造を見ないと判断しずらいところもあるのですが:

時には、スキーマに沿った形のクラスを設計して、
XMLSerializer あるいは SoapFormatter で変換することもあります。

とはいえ SOAP 通信が目的なら、Visual Studio で自動的にプロキシクラスを
生成できるので、WSDL が提供されている場合はそれをそのまま使うことが殆どです。
この場合、XML の存在を意識せずに済みます。

ただ、SOAP メッセージの内容によっては、自動的に生成されるプロキシクラスでは
対応できないこともあるので、その場合は自前で XML を構築したこともあります。

最近は SOAP ではなく、REST で構築されたサーバーが多いですね。


XML データを直接操作する場合については、個人的には
XDocument を使うことが多いです。(この方法で XML を扱う場合は
C# より VB の方が楽だったりしますが、C# でも大差はありません)
引用返信 編集キー/
■87076 / inTopicNo.8)  Re[4]: XMLスキーマの使い方について
□投稿者/ MTK (46回)-(2018/04/10(Tue) 17:41:55)
No87067 (WebSurfer さん) に返信

> 既存のサービスの API にその仕様に合わせて xml データを作成し送信するということですか? 
> であれば、その仕様の詳細を明確にしていただかないと的を得た答えは出せそうもないです。

そうですよね;;
まずはスキーマとは何でどうすればいいのか でつまずいてしまっており、仕様のところが見えていません(というか、見方が分からないというのが正しいです)
どうなっていたらSOAP通信と判断できるのか、Web サービス / WCF サービスにあてはまるのか、正直さっぱりわかっておりません。

xmlを送信する先のURLがiniファイルで用意されており、先方サイトのライブラリに記載してあるメソッドの引数にxmlを指定して送信するようです。
xmlの仕様書なるエクセルが用意されており、どんな要素がどんなタグ名で示されていて、どんな構造になっているかなどが記載されています。
それとは別にXML Schemaが用意されています。

もう少し調べてみたいと思います。


参考サイトありがとうございます。
なるほど、SOAP を利用した Web サービス / WCF サービスであれば、xmlを意識せずにできるんですね。
今回使えそうであれば、是非使ってみたいと思います。
引用返信 編集キー/
■87077 / inTopicNo.9)  Re[5]: XMLスキーマの使い方について
□投稿者/ なちゃ (243回)-(2018/04/10(Tue) 18:00:06)
たまに、送信するxmlの仕様だけがXMLスキーマで指定されているだけ、というようなサービスなんていうのもあるようです。
※特にコンシューマ向けではないサービスの場合など。

wsdlなどではなく単にスキーマが提示されているだけの場合などは、xmlスキーマに対してxsd.exeというコマンドラインツールを使うことで、読み書き用のソースファイルを自動生成できます。
※もしかしたらVisual Studio上から直に起動もできるかもしれませんが

場合によっては、生成されたソースを若干手直しする必要があるかもしれませんが、大体そのままで活用はできたように思います。
引用返信 編集キー/
■87078 / inTopicNo.10)  Re[4]: XMLスキーマの使い方について
□投稿者/ MTK (47回)-(2018/04/10(Tue) 18:01:13)
No87071 (魔界の仮面弁士 さん) に返信

> 狭義のデータベースとはちょっと異なりますが、概ねそんな感じです。
>
> データベースを模した形のデータの入れ物というだけなので、
> データベースと無関係なデータを蓄えることも出来ます。

なるほど、まるっきりデータベースと同じという訳ではないんですね。



> 正確には『データベースの制約』ではなく、『DataSet 自身の制約』情報ですね。
>
> たとえば、データベース側は数値型の列だけど、DataSet は文字列型の列として、
> 管理させている場合もあります。また、列のデータ型なども、
> データベースにとっての型ではなく、.NET にとっての型で管理されます。
>
>
> 【参考情報】
> .NET の System.DateTime 型の範囲は 0001/01/01 00:00:00.0000000〜9999/12/31 23:59:59.9999999
> SQL Server の datetime 型の範囲は 1753/01/01 00:00:00.000〜9999/12/31 23:59:59.997
> Oracle の DATE 型の範囲は -4712/01/01 00:00:00〜9999/12/31 23:59:59
> Access の DATE 型の範囲は 0100/01/01 00:00:00〜9999/12/31 23:59:59

DataSet=データベースではなく、DataSet上にデータベース(のようなもの)を展開してバインドしているイメージで合っているでしょうか?
その上で、XML SchemaはDataSet側の制約なのですね。
同じ日付の型でもここまで違うんですね・・・
ありがとうございます。



>>もし今使うならこれがいい など個人的な意見で結構ですので、オススメがあれば教えて頂けないでしょうか。
> 求められている XML 構造を見ないと判断しずらいところもあるのですが:
>
> 時には、スキーマに沿った形のクラスを設計して、
> XMLSerializer あるいは SoapFormatter で変換することもあります。
>
> とはいえ SOAP 通信が目的なら、Visual Studio で自動的にプロキシクラスを
> 生成できるので、WSDL が提供されている場合はそれをそのまま使うことが殆どです。
> この場合、XML の存在を意識せずに済みます。
>
> ただ、SOAP メッセージの内容によっては、自動的に生成されるプロキシクラスでは
> 対応できないこともあるので、その場合は自前で XML を構築したこともあります。
>
> 最近は SOAP ではなく、REST で構築されたサーバーが多いですね。
>
>
> XML データを直接操作する場合については、個人的には
> XDocument を使うことが多いです。(この方法で XML を扱う場合は
> C# より VB の方が楽だったりしますが、C# でも大差はありません)

XML構造によって、どれを使うのがいいかが変わるんですね。
そのあたりはこれからXML構造を見て、勉強していきたいと思います。
本当はこちらにXML構造を貼ってしまいたいところですが、事情により公開しづらいので;;

使えるのであれば、XMLを直接作るよりそのやり方でやりたいですね。
まずは現状把握から、ですね。
引用返信 編集キー/
■87079 / inTopicNo.11)  Re[6]: XMLスキーマの使い方について
□投稿者/ MTK (48回)-(2018/04/10(Tue) 18:07:31)
No87077 (なちゃ さん) に返信

回答ありがとうございます。


> たまに、送信するxmlの仕様だけがXMLスキーマで指定されているだけ、というようなサービスなんていうのもあるようです。
> ※特にコンシューマ向けではないサービスの場合など。
>
> wsdlなどではなく単にスキーマが提示されているだけの場合などは、xmlスキーマに対してxsd.exeというコマンドラインツールを使うことで、読み書き用のソースファイルを自動生成できます。
> ※もしかしたらVisual Studio上から直に起動もできるかもしれませんが
>
> 場合によっては、生成されたソースを若干手直しする必要があるかもしれませんが、大体そのままで活用はできたように思います。

XMLの仕様だけは詳細に書いてあるのですが・・・それ以外の、大まかな流れみたいな仕様が見当たらないのです。
もしかしたら仰っているようなサービスなのかもしれません。

コマンドラインツールでソースファイルができるんですね!
それは便利そうです。
それも調べてみたいと思います。
引用返信 編集キー/
■87083 / inTopicNo.12)  Re[5]: XMLスキーマの使い方について
□投稿者/ WebSurfer (1464回)-(2018/04/11(Wed) 10:17:05)
No87076 (MTK さん) に返信

> xmlを送信する先のURLがiniファイルで用意されており、先方サイトのライブラリに記載してあるメソッドの引数にxmlを指定して送信するようです。
> xmlの仕様書なるエクセルが用意されており、どんな要素がどんなタグ名で示されていて、どんな構造になっているかなどが記載されています。

想像ですが(なのでハズレかもしれませんが)、その「xmlを送信する先」は従来の SOAP を利用した
Web サービスではないのですか?

そして、、その「メソッド」は文字列を引数として取る Web サービスのメソッドで、何らかのデータ
を xml 形式に組み立てて、それを文字列として Web サービスのメソッドに対して送信するということ
ではないのですか?

Web サービスのメソッドというのは、具体的な例としては、先に紹介した記事(URL 再掲)のメソッド
public string GetData(int value) で int value をstring value にしたような感じです。

10 行でズバリ!! [C#] WCF サービスの作成と利用
https://code.msdn.microsoft.com/windowsdesktop/10-C-WCF-a3831723

その可能性を調べてみてはいかがですか?

調べてもわからなければ、試しに「送信する先のURL」を使って、上に紹介した記事の「3. Windows
クライアントで WCF サービスを利用する」を参考に Visual Studio で [サービス参照の追加] をトラ
イしてみてはいかがですか。
引用返信 編集キー/
■87086 / inTopicNo.13)  Re[6]: XMLスキーマの使い方について
□投稿者/ なちゃ (244回)-(2018/04/11(Wed) 10:51:47)
一応推測で述べておくと、ライブラリとしてxmlを引数で受けるメソッドが提供されているとのことから、おそらくはwsdlとかで仕様を公開してるタイプのサービスではないだろうと思います。
もちろん確認してみることを否定するものではありません。

※何でそう思うかというと、某サービスでB2B向けに実際にそういう形態のサービスがあって、呼び出しのコードをサンプル実装した経験があるからです。
引用返信 編集キー/
■87111 / inTopicNo.14)  Re[6]: XMLスキーマの使い方について
□投稿者/ MTK (49回)-(2018/04/12(Thu) 11:33:57)
No87083 (WebSurfer さん) に返信


> 調べてもわからなければ、試しに「送信する先のURL」を使って、上に紹介した記事の「3. Windows
> クライアントで WCF サービスを利用する」を参考に Visual Studio で [サービス参照の追加] をトラ
> イしてみてはいかがですか。

ご指摘の通り、掲載頂いたURLを元にトライしてみました。
『図 7. [サービス参照の追加] ダイアログ』の画面まで行き接続先のURLでやってみたのですが、残念ながら対応していないようでした。
となるとXMLを自分で作る必要がありそうですね。
それが分かったことだけでも収穫がありました。
ありがとうございました。




> ■No87076 (MTK さん) に返信
>
>>xmlを送信する先のURLがiniファイルで用意されており、先方サイトのライブラリに記載してあるメソッドの引数にxmlを指定して送信するようです。
>>xmlの仕様書なるエクセルが用意されており、どんな要素がどんなタグ名で示されていて、どんな構造になっているかなどが記載されています。
>
> 想像ですが(なのでハズレかもしれませんが)、その「xmlを送信する先」は従来の SOAP を利用した
> Web サービスではないのですか?
>
> そして、、その「メソッド」は文字列を引数として取る Web サービスのメソッドで、何らかのデータ
> を xml 形式に組み立てて、それを文字列として Web サービスのメソッドに対して送信するということ
> ではないのですか?
>
> Web サービスのメソッドというのは、具体的な例としては、先に紹介した記事(URL 再掲)のメソッド
> public string GetData(int value) で int value をstring value にしたような感じです。
>
> 10 行でズバリ!! [C#] WCF サービスの作成と利用
> https://code.msdn.microsoft.com/windowsdesktop/10-C-WCF-a3831723
>
> その可能性を調べてみてはいかがですか?
>
> 調べてもわからなければ、試しに「送信する先のURL」を使って、上に紹介した記事の「3. Windows
> クライアントで WCF サービスを利用する」を参考に Visual Studio で [サービス参照の追加] をトラ
> イしてみてはいかがですか。
引用返信 編集キー/
■87112 / inTopicNo.15)  Re[7]: XMLスキーマの使い方について
□投稿者/ MTK (50回)-(2018/04/12(Thu) 11:38:02)
No87086 (なちゃ さん) に返信


> 一応推測で述べておくと、ライブラリとしてxmlを引数で受けるメソッドが提供されているとのことから、おそらくはwsdlとかで仕様を公開してるタイプのサービスではないだろうと思います。
> もちろん確認してみることを否定するものではありません。
>
> ※何でそう思うかというと、某サービスでB2B向けに実際にそういう形態のサービスがあって、呼び出しのコードをサンプル実装した経験があるからです。

検証の結果、恐らく仰る通りではないかと思います。
教えて頂いたコマンドラインツールを使ってみましたが、ソースファイルを自動生成しようとしてエラーが凄い出てしまっている状態です。
十中八九、使い方が悪いのかと思われます^^;
もう少し調べながら、色々試していこうと思います。
ありがとうございました。
解決済み
引用返信 編集キー/
■87116 / inTopicNo.16)  Re[7]: XMLスキーマの使い方について
□投稿者/ WebSurfer (1470回)-(2018/04/12(Thu) 12:39:07)
No87111 (MTK さん) に返信

>>調べてもわからなければ、試しに「送信する先のURL」を使って、上に紹介した記事の「3. Windows
>>クライアントで WCF サービスを利用する」を参考に Visual Studio で [サービス参照の追加] をトラ
>>イしてみてはいかがですか。
>
> ご指摘の通り、掲載頂いたURLを元にトライしてみました。
> 『図 7. [サービス参照の追加] ダイアログ』の画面まで行き接続先のURLでやってみたのですが、残念ながら対応していないようでした。
> となるとXMLを自分で作る必要がありそうですね。

私の想像が当たっていたとしても、送信するための xml 形式の文字列は自力で作らざるを得ないと思います。

Web サイトに接続しして、送信し、返ってきた応答を受け取るというところはプロキシクラスが面倒を見てくれるの
で、想像が当たっていたとすると、そこのところを自力でコードを書いて実装する必要がなくなるという違いがある
とは思いますが。


解決済み
引用返信 編集キー/
■87117 / inTopicNo.17)  Re[8]: XMLスキーマの使い方について
□投稿者/ MTK (51回)-(2018/04/12(Thu) 14:34:13)
2018/04/12(Thu) 14:34:55 編集(投稿者)

No87116 (WebSurfer さん) に返信


> 私の想像が当たっていたとしても、送信するための xml 形式の文字列は自力で作らざるを得ないと思います。
>
> Web サイトに接続しして、送信し、返ってきた応答を受け取るというところはプロキシクラスが面倒を見てくれるの
> で、想像が当たっていたとすると、そこのところを自力でコードを書いて実装する必要がなくなるという違いがある
> とは思いますが。

XMLはどちらにせよ、自力で作らなければいけないんですね。
てっきりXMLを1から作らなくても、テンプレートみたいなものが先方サイトから貰えるのかと勘違いしていました。
送受信などをプロキシクラスが見てくれるだけでも助かります。
ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -