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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ASP.NET

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

Q&A

解決済

2回答

9205閲覧

webサービスがXMLをレスポンスする場合の受け取り方

doremifa

総合スコア33

C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ASP.NET

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

0グッド

0クリップ

投稿2016/10/09 08:04

編集2016/10/09 13:46

###前提・実現したいこと
XMLをレスポンスしてくるwebサービスから受け取ったxmlの内容を画面表示したいのですが
うまくとれないでいます。
[name]という要素はとれるのですがそれ以外のあるはずの要素が見つからないようです。
何がいけないのでしょうか。

【追記】
以下のスレッドの続きです。内容が変わってきたので立て直しました。
xmlのクラスへの展開方法
https://teratail.com/questions/50746

エラーメッセージ 追加情報:名前 'version' のフィールドまたはプロパティが選択されたデータ ソースに見つかりませんでした。

###aspx

<asp:XmlDataSource ID="XmlDataSource1" runat="server"></asp:XmlDataSource> <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> <asp:GridView ID="GridView1" runat="server" EnableModelValidation="True"> <Columns> <!--これは取得できる--> <asp:BoundField HeaderText="test" DataField="name" /> <!--このversionの行を追加すると見つからないようだがXML仕様にはあるはず--> <asp:BoundField HeaderText="test2" DataField="version" /> </Columns> </asp:GridView>

###C#

protected void Button1_Click(object sender, EventArgs e) { string url = @"http://zip.cgis.biz/xml/zip.php"; WebClient wc = new WebClient(); NameValueCollection nvc = new NameValueCollection(); nvc.Add("zn", "1500013"); wc.QueryString = nvc; wc.Encoding = System.Text.Encoding.UTF8; string aaaa = wc.DownloadString(url); wc.Dispose(); XmlDataSource1.Data = aaaa; GridView1.DataSource = XmlDataSource1; GridView1.DataBind(); //以下はserializerをつかってなんとかしようとした残骸 //var url = @"http://zip.cgis.biz/xml/zip.php"; //HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; //HttpWebResponse response = request.GetResponse() as HttpWebResponse; //var stream = response.GetResponseStream(); ////XmlSerializer serializer = new XmlSerializer(typeof(AAA)); ////var report = serializer.Deserialize(stream) as AAA; //System.IO.StringReader reader = new StringReader(aaaa); //DataSet DS = new DataSet(); //DS.ReadXml(reader, XmlReadMode.Fragment); //GridView1.DataSource = DS; //GridView1.DataBind(); }

###上記aaaaのXmlDataSource1.Dataに入れる直前の中身

<?xml version=\"1.0\" encoding=\"utf-8\" ?><ZIP_result><result name=\"ZipSearchXML\" /><result version=\"1.01\" /><result request_url=\"http%3A%2F%2Fzip.cgis.biz%2Fxml%2Fzip.php%3Fzn%3D1500013\" /><result request_zip_num=\"1500013\" /><result request_zip_version=\"none\" /><result result_code=\"1\" /><result result_zip_num=\"1500013\" /><result result_zip_version=\"0\" /><result result_values_count=\"1\" /><ADDRESS_value><value state_kana=\"トウキョウト\" /><value city_kana=\"シブヤク\" /><value address_kana=\"エビス(ツギノビルヲノゾク)\" /><value company_kana=\"none\" /><value state=\"東京都\" /><value city=\"渋谷区\" /><value address=\"恵比寿(次のビルを除く)\" /><value company=\"none\" /></ADDRESS_value></ZIP_result>

###Webサービスのレスポンス仕様

http://zip.cgis.biz/receive/element_list_xml.html

###補足情報(言語/FW/ツール等のバージョンなど)
ドットネットフレークワーク4.5.2
C#

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/10/09 11:59

前のスレッドの続きだということを書いて、そのスレッドの URL を書きましょう。回答者が web サービスにアクセスして xml データを取得することは期待しないで、質問者さんの方で取得して、その文字列を書いてください(長いのは NG。サンプルとして適当な長さで)。
doremifa

2016/10/09 13:47

修正対応いたしました。
guest

回答2

0

ベストアンサー

上の質問の「Webサービスのレスポンス仕様」に書いてあった URL を見ましたが、エラー時の処置が必要で(イイカゲンに入力するユーザーも多いでしょうから)、単純に Web サービスから返ってきたデータを GridView にバインドすればよいというものではなさそうですね。

エラー処置を行うとすると、前のスレッドで行ったような XmlDataSource を使うのではうまくいかないと思います。

なので、前のスレッドの案はやめて、xml 文字列から XElement オブジェクトを作り、result_code をチェックしてエラーがあればエラー処置、無ければ XElement オブジェクトからデータを取得して表示するというようにしてはいかがですか?

また、多分、以下の URL にあるような郵便番号から住所を調べるようなことがしたいのだと思いますが、であれば住所を表示するのに GridView を使うのが適当かどうかは考え直した方がよさそうな気がします。

http://postcode.goo.ne.jp/

【2016/10/11 11:30 追記】

上に書いた「xml 文字列から XElement オブジェクトを作り・・・」のサンプルコードを貼っておきます。エラー処置そのものは省略しました。質問者さんの方で適切な方法を考えてください。

foreach のループ処置が力技的で何ですが、取りあえずのサンプルということで・・・

代わりに Linq to XML とかを使うともっとスマートにできるかもしれません(興味がおありでしたら新たに別スレッドを立てて質問してください。ASP.NET ということでなく C# の分類にされるといいと思います)。

<%@ Page Language="C#" %> <%@ Import Namespace="System.IO" %> <%@ Import Namespace="System.Xml.Linq" %> <%@ Import Namespace="System.Xml.XPath" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> string xmlString = @"<?xml version=""1.0"" encoding=""utf-8"" ?> <ZIP_result> <result name=""ZipSearchXML"" /> <result version=""1.01"" /> <result request_url=""http%3A%2F%2Fzip.cgis.biz%2Fxml%2Fzip.php%3Fzn%3D1500013"" /> <result request_zip_num=""1500013"" /> <result request_zip_version=""none"" /> <result result_code=""1"" /> <result result_zip_num=""1500013"" /> <result result_zip_version=""0"" /> <result result_values_count=""1"" /> <ADDRESS_value> <value state_kana=""トウキョウト"" /> <value city_kana=""シブヤク"" /> <value address_kana=""エビス(ツギノビルヲノゾク)"" /> <value company_kana=""none"" /> <value state=""東京都"" /> <value city=""渋谷区"" /> <value address=""恵比寿(次のビルを除く)"" /> <value company=""none"" /> </ADDRESS_value> </ZIP_result> "; public class AddressValue { public string StateKana { get; set; } public string CityKana { get; set; } public string AddressKana { get; set; } public string CompanyKana { get; set; } public string State { get; set; } public string City { get; set; } public string Address { get; set; } public string Company { get; set; } } protected void Page_Load(object sender, EventArgs e) { TextReader sr = new StringReader(xmlString); XElement zipResult = XElement.Load(sr); sr.Close(); if (zipResult.XPathSelectElement("result[@result_code='1']") == null) { // エラー処置 return; } List<AddressValue> list = new List<AddressValue>(); foreach (XElement address in zipResult.Elements("ADDRESS_value")) { AddressValue item = new AddressValue(); item.StateKana = address.XPathSelectElement("value[@state_kana]").Attribute("state_kana").Value; item.CityKana = address.XPathSelectElement("value[@city_kana]").Attribute("city_kana").Value; item.AddressKana = address.XPathSelectElement("value[@address_kana]").Attribute("address_kana").Value; item.CompanyKana = address.XPathSelectElement("value[@company_kana]").Attribute("company_kana").Value; item.State = address.XPathSelectElement("value[@state]").Attribute("state").Value; item.City = address.XPathSelectElement("value[@city]").Attribute("city").Value; item.Address = address.XPathSelectElement("value[@address]").Attribute("address").Value; item.Company = address.XPathSelectElement("value[@company]").Attribute("company").Value; list.Add(item); } GridView1.DataSource = list; GridView1.DataBind(); } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <h1>郵便番号検索</h1> <asp:GridView ID="GridView1" runat="server"> </asp:GridView> </div> </form> </body> </html>

投稿2016/10/10 06:05

編集2016/10/11 02:35
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

doremifa

2016/10/11 09:40

確認遅くなりました。 サンプルありがとうございます。 おかげさまで処理の流れも理解することができました。
guest

0

エラーメッセージには「varsion」とありますが、aspxには「varsion」とあります。
取得時のスペルミスのような気がしますので、再度一致しているかご確認ください。

投稿2016/10/09 13:28

goute

総合スコア216

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

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

doremifa

2016/10/09 13:46

誤字でした。すみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問