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

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

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

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

1304閲覧

郵便番号APIを叩き、返ってきたレスポンスを調理し、表示させたい。

abenosan00

総合スコア33

C#

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2019/08/02 03:56

編集2019/08/02 03:57

郵便番号APIを叩き、返ってきたレスポンス結果を、WPFに表示させたい(ListBox)

実行フロー

  1. Windowsアプリケーションから郵便番号を入力し、ボタンを押下
  2. ExportXml7Asyncの引数に郵便番号を渡し呼び出される。

---期待するフロー ↓

  1. xmlListsで取得した要素をListBoxに表示させる。

レスポンスXML情報

XML

1<response> 2<status>OK</status> 3<results> 4<method>address</method> 5<type>xml</type> 6<count>1</count> 7<address> 8<zipcode>6356322</zipcode>   // 表示 9<ken_id>27</ken_id>       // 表示 10<ken>山口県</ken>         // 表示 11<address1>山田市</address1> // 表示 12<address2>大中南町</address2> // 表示 13<ken_kana>ナラケン</ken_kana> 14<address1_kana>ヤマトタカダシ</address1_kana> 15<address2_kana>オオナカミナミチョウ</address2_kana> 16</address> 17</results> 18</response>

C#

1 public async Task ExportXml7Async(int number) 2 { 3 using (var client = new HttpClient()) 4 { 5         // リスト初期化 6 testList.Items.Clear(); 7         // APIを叩く 8 var result1 = await client.GetStringAsync(string.Format(@"http://groovelab.asia/zipcode/address.xml?zipcode={0}", number)); // GET 9   var xmlList = XElement.Parse(result1); 10         // 必要な要素だけを取り出す オブジェクト生成 11 var selectXmlList = xmlList.Elements().Select(x => new 12 { 13 Zipcode = (int)x.Element("zipcode"), 14 KenId = (int)x.Element("ken_id"), 15 Ken = (string)x.Element("ken"), 16 Address = (string)x.Element("address"), 17 Address2 = (string)x.Element("address2") 18 }); 19          20         // ListBoxに表示 21 foreach (var xmldata in selectXmlList) // error? 22 { 23 testList.Items.Add(xmldata.Zipcode); 24 testList.Items.Add(xmldata.KenId); 25 testList.Items.Add(xmldata.Ken); 26 testList.Items.Add(xmldata.Address); 27 testList.Items.Add(xmldata.Address2); 28 } 29 } 30 }

foreach文でエラー?が発生します。
イメージ説明

簡単なご説明になりましたが、何卒宜しくお願い致します。

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

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

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

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

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

abenosan00

2019/08/02 05:10

あ、申し訳ありません、 既存コードに私の住所が乗ってたので、テラテイル側で適当な数値に差し替えました。
abenosan00

2019/08/02 05:43

Descendantsメソッドを使うやり方でも実装出来ました。(参考までに) takabosoft様のご回答の方が階層が明確になっており分かりやすいと思います。 ``` var selectXmlList = xmlList.Descendants("address").Select(x => new { Zipcode = (int)x.Element("zipcode"), KenId = (int)x.Element("ken_id"), Ken = (string)x.Element("ken"), Address = (string)x.Element("address"), Address2 = (string)x.Element("address2") }); ```
guest

回答1

0

ベストアンサー

XMLの階層を無視しているので、エラーが出ているんだと思います。
以下のようにresultsタグの中のaddressタグを複数列挙したあとで、抽出する感じにしてください。

csharp

1// 必要な要素だけを取り出す オブジェクト生成 2var selectXmlList = xmlList.Element("results").Elements("address").Select(x => new 3{ 4 Zipcode = (int)x.Element("zipcode"), 5 KenId = (int)x.Element("ken_id"), 6 Ken = (string)x.Element("ken"), 7 Address = (string)x.Element("address"), 8 Address2 = (string)x.Element("address2") 9});

投稿2019/08/02 05:04

takabosoft

総合スコア8356

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

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

abenosan00

2019/08/02 05:09 編集

なるほど・・・ ご指摘の方法で無事動作確認ができました。 ありがとうございます。 どちらのエラー確認し、原因を解決できたのか教えていただけるとありがたいです。(今後の問題解決の参考にしたいです)
takabosoft

2019/08/02 05:20

エラーはNULL系のやつでしたので、まあ存在しないタグにアクセスしてるかなんかだろうという予測は立てました。 ※今回の場合はエラーやエラーの該当開所だけ見ても解決に至りにくいのは確かかと思います。 xmlList.Elements()自体はルート(response)の子要素を全部返すやつだけだと思いますが、それらの要素の中にzipcodeなどは無いでしょうから、ここが明らかにおかしいことはわかりました。 質問者さんは ・Elements()が階層を無視して全部要素取ってくる関数と間違えている ・そもそもXMLが階層構造だという事を知らない のどちらかだろうと予想を勝手に立ててまずは動くコードを提示して反応を見ようとしました。
takabosoft

2019/08/02 05:22

もしよかったら、思っていたこととコーディングした結果と、どこがずれていたのかを教えて下さい(今後の回答者としての問題解決の参考にしたいです)。
abenosan00

2019/08/02 05:26

非常に明快な回答をありがとうございます。 今回のご指摘頂いたおかげで、私自身まだまだXMLファイル操作に慣れていないということが明確になりました。 まずXMLはどういうのもなのかをもう一度復習したいと思います。 お忙しい中、問題解決にご協力いただきありがとうございました。
abenosan00

2019/08/02 05:31

xmlが階層構造という認識が曖昧な状態で実装してしまい、 「xmlList.Elements().Select」の部分で完全に親要素を無視して、指定した要素を取得できるのではないかと勘違いしておりました。(教材読み返すとちゃんと書いてありました・・・((恥))
takabosoft

2019/08/02 05:56

???? ありがとうございます。勉強がんばってくださいね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問