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

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

ただいまの
回答率

90.37%

  • C#

    8268questions

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

  • ASP.NET

    587questions

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

  • .NET Framework

    506questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,548

doremifa

score 25

前提・実現したいこと

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#

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2016/10/09 20:59

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

    キャンセル

  • doremifa

    2016/10/09 22:47

    修正対応いたしました。

    キャンセル

回答 2

checkベストアンサー

+1

上の質問の「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/11 18:40

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/09 22:46

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

    キャンセル

同じタグがついた質問を見る

  • C#

    8268questions

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

  • ASP.NET

    587questions

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

  • .NET Framework

    506questions

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