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

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

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

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

C#

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

XMLパーサ

XML文書のテキストデータだけを抜き出して、アプリケーションソフトが利用しやすい形式に変換させるソフトウェアをXMLパーサと呼びます。

.NET Framework

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

Q&A

解決済

2回答

10955閲覧

[C#] XMLを読み込みクラスに変換する方法

alths122

総合スコア16

XML

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

C#

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

XMLパーサ

XML文書のテキストデータだけを抜き出して、アプリケーションソフトが利用しやすい形式に変換させるソフトウェアをXMLパーサと呼びます。

.NET Framework

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

1グッド

1クリップ

投稿2016/05/03 15:47

質問

C#を用いてXMLデータ(string文字列)を解析し、オブジェクト(のリスト)に変換したいと思っています。
変換にはSystem.Xml.Serializationを使用しています。
変換作業時にエラーが発生し対処方法がわからないため質問します。

やりたいこと

Yahoo!知恵袋のAPIを用いて取得した新着質問リスト(XML)をクラスオブジェクトに変換します。

XMLサンプル(「サンプルレスポンス」の箇所です)
http://developer.yahoo.co.jp/webapi/chiebukuro/chiebukuro/v1/getnewquestionlist.html

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<ResultSet xmlns="urn:yahoo:jp:chiebukuro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:yahoo:jp:chiebukuro" totalResultsAvailable="42410" totalResultsReturned="2" firstResultPosition="1"> 3 <Result> 4 <QuestionId>123456789</QuestionId> 5 <QuestionUrl>http://detail.chiebukuro.yahoo.co.jp/rd/q123456789</QuestionUrl> 6 <Content><![CDATA[破れたお金は交換してもらえますか? 7 8お金を子どもがびりびりに破いてしまいました。 9破れたお金でもどこかで交換してくれると聞いたことがありますが、本当ですか?]]></Content> 10 <CategoryId>2078297847</CategoryId> 11 <Category><![CDATA[数学]]></Category> 12 <CategoryPath><![CDATA[教養と学問、サイエンス|数学、サイエンス|数学]]></CategoryPath> 13 <AnsCount>0</AnsCount> 14 <IsMobile>false</IsMobile> 15 <HasImage>false</HasImage> 16 <Coin>500</Coin> 17 <UpdatedDate>2011-01-01T00:00:01+09:00</UpdatedDate> 18 </Result> 19 <Result> 20 <QuestionId>123456789</QuestionId> 21 <QuestionUrl>http://detail.chiebukuro.yahoo.co.jp/rd/q123456789</QuestionUrl> 22 <Content><![CDATA[破れたお金は交換してもらえますか? 23 24お金を子どもがびりびりに破いてしまいました。 25破れたお金でもどこかで交換してくれると聞いたことがありますが、本当ですか?]]></Content> 26 <CategoryId>2078297819</CategoryId> 27 <Category><![CDATA[あいさつ、てがみ、文例]]></Category> 28 <CategoryPath><![CDATA[マナー、冠婚葬祭|マナー|あいさつ、てがみ、文例]]></CategoryPath> 29 <AnsCount>0</AnsCount> 30 <IsMobile>false</IsMobile> 31 <HasImage>false</HasImage> 32 <Coin>50</Coin> 33 <UpdatedDate>2011-01-01T00:00:00+09:00</UpdatedDate> 34 </Result> 35</ResultSet>

実装

XMLデータをクラスに変換するため、以下のように実装しました。

[記事(Result)の一覧(ResultSet)を管理するクラス]

cs

1 [System.Xml.Serialization.XmlRoot("ResultSet")] 2 public class ChieArticleList 3 { 4 [System.Xml.Serialization.XmlElement("Result")] 5 public List<ChieArticle> Articles { get; set; } 6 }

[記事(Result)クラス]

cs

1 public class ChieArticle 2 { 3 [System.Xml.Serialization.XmlElement("QuestionId")] 4 public string QuestionId { get; set; } 5 6 [System.Xml.Serialization.XmlElement("QuestionUrl")] 7 public string QuestionUrl { get; set; } 8 9 [System.Xml.Serialization.XmlElement("Content")] 10 public string Content { get; set; } 11 }

[メイン処理]

cs

1// 注:ここにXMLが文字列の状態で入っているとします。 2string strXml = ** XMLDATA **; 3 4TextReader reader = new StringReader(strXml); 5XmlSerializer serializer = new XmlSerializer(typeof(ChieArticleList)); 6ChieArticleList articles = (ChieArticleList)serializer.Deserialize(reader);

問題

上記のプログラムを実行すると、以下の処理時にInvalidOperationExceptionが発生します。

ChieArticleList articles = (ChieArticleList)serializer.Deserialize(reader);

例外の詳細(InnerException)を見ると、{"<ResultSet xmlns='urn:yahoo:jp:chiebukuro'> は指定できません。"}となっていました。

XMLが解析されクラスオブジェクトに変換されている想定でした。
なぜこのようなエラーが発生するのでしょうか。

参考資料

XmlSerializerの使用にあたり、以下のサイトを参考にしました。

Tak1wa👍を押しています

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

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

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

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

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

guest

回答2

0

自己解決しました。

今回はYahoo! APIを用いてXMLを取得し、これをオブジェクトに変換することが目的でした。
Yahoo!側でxsdファイルが用意されていたので、これを元にしてクラスを作成しました。
また、そのクラスとXml.Serializationを使用してXMLオブジェクト化に成功しました。

以下サイトを参考にしました。
http://biz-crew.com/archives/1297

投稿2016/05/04 03:15

alths122

総合スコア16

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

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

0

ベストアンサー

そういう用向きにはLINQ to XMLとかを使った方がベターでは?

エラーメッセージは「ルート要素の名前が指定されていますけど、実際のルート要素とちがってますよ」的な感じですかね

投稿2016/05/03 22:14

編集2016/05/03 23:08
dojikko

総合スコア3939

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

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

alths122

2016/05/04 03:08

ありがとうございます。こういう場合にはLINQを使うものなんですね。 その後 LINQ to XML も試してみたのですが、同じ問題で読み込みに失敗しました。 (恐らくXMLを文字列にする際に内容が破損したのだろうと思っています)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問