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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

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

Q&A

解決済

2回答

7789閲覧

XmlSerializerを使ったXMLのデシリアライズについて

mitta-taka

総合スコア7

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

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

0グッド

0クリップ

投稿2018/04/28 16:17

前提・実現したいこと

.NETのXmlSerializerについて質問させてください。
現在、RestAPIでサーバーからレンスポンスを受け取り、それを加工して画面に表示するアプリを作成しています。
レスポンスはXML形式なので、XmlSerializerを使ってオブジェクトクラスにデシリアライズしています。
その際、必要なデータのみをデシリアライズしたいのですが、オブジェクトクラスに定義されていないデータに関して以下のエラーメッセージが発生します。

該当のソースコードにおいて、XXXクラスと同様にYYYクラスを作成すればデータを読み込むことはできるのですが、
実際にはidがどのようなタイプで何件来るかわかっていません。
(ひょっとすると「<aaa:id xsi:type="bbb:ZZZ">3333</aaa:id>」というデータが返ってくるかもしれません。)

ですので、可能であればXXXのデータのみ読み込む、または全件読み込んだ後にXXXのデータを判別する方法があれば教えていただきたいです。
よろしくお願いします。

発生している問題・エラーメッセージ

InvalidOperationException: 指定された型は認識されませんでした : name='YYY'、namespace='BBB'、場所 <id xmlns='AAA'>

デシリアライズしたいXML

XML

1<?xml version="1.0" encoding="UTF-8"?> 2<data xmlns:aaa="AAA" xmlns:bbb="BBB" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 3 <aaa:id xsi:type="bbb:XXX">1111</aaa:id> 4 <aaa:id xsi:type="bbb:YYY">2222</aaa:id> 5</data>

該当のソースコード

C#

1 // データモデル 2 public class data 3 { 4 [XmlElement(Namespace = "AAA")] 5 public List<Test> id { get; set; } 6 } 7 8 [XmlRoot(Namespace = "BBB")] 9 [XmlInclude(typeof(XXX))] 10 public class Test 11 { 12 [XmlText] 13 public string Value { get; set; } 14 } 15 16 [XmlRoot(Namespace = "BBB")] 17 public class XXX : Test 18 { 19 } 20 21 // デシリアライズ処理 22 using (var stream = File.OpenRead(XML_FILE_PATH)) 23 { 24 var xml = new XmlSerializer(typeof(data)); 25 var deserializeeObject = (data)xml.Deserialize(stream); 26 }

補足情報(FW/ツールのバージョンなど)

Microsoft Visual Studio Community 2017
.NET Standard 2.0

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

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

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

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

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

guest

回答2

0

XmlSerializerってのは、そいつでシリアライズしたものを、そいつでデシリアライズするためのもの、と思ってます。
既存の、他で生成されたXMLデータを解析する用途には使うものではないです

そういう用途にはXmlTextReaderとかそういうので読むべきだと思いますです

投稿2018/04/28 23:46

y_waiwai

総合スコア87719

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

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

mitta-taka

2018/04/29 15:47

なるほど、よそから受け取ったXMLは、XmlSerializerではなく別のクラスを使って読み込むべきということですね。 ちょっと調べてみます。
guest

0

ベストアンサー

LINQ to XML や DOM を使ってデシリアライズ前に XML を加工してください。

C#

1using System; 2using System.Collections.Generic; 3using System.IO; 4using System.Linq; 5using System.Xml.Linq; 6using System.Xml.Serialization; 7 8namespace ConsoleApp1 9{ 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TextFile1.txt"); 15 var xml = XElement.Load(fileName); 16 xml 17 .Elements() 18 .Where(a => a.Attribute(XName.Get("type", "http://www.w3.org/2001/XMLSchema-instance")).Value != "bbb:XXX") 19 .Remove(); 20 Console.WriteLine(xml.ToString()); 21 var serializer = new XmlSerializer(typeof(data)); 22 using (var reader = xml.CreateReader()) 23 { 24 var data = (data)serializer.Deserialize(reader); 25 Console.WriteLine(data.id); 26 } 27 Console.ReadKey(); 28 } 29 } 30 31 // データモデル 32 public class data 33 { 34 [XmlElement(Namespace = "AAA")] 35 public List<Test> id { get; set; } 36 } 37 38 [XmlRoot(Namespace = "BBB")] 39 [XmlInclude(typeof(XXX))] 40 public class Test 41 { 42 [XmlText] 43 public string Value { get; set; } 44 } 45 46 [XmlRoot(Namespace = "BBB")] 47 public class XXX : Test 48 { 49 } 50}

投稿2018/04/29 10:02

Zuishin

総合スコア28656

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

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

mitta-taka

2018/04/29 15:50

y_waiwaiさんの回答でLINQ to XMLなどのキーワードにはたどり着いていたのですが、使い方を調べる前に具体的なコードを書いていただき助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問