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

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

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

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

C#

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

Q&A

解決済

1回答

1891閲覧

クラスに存在しないメンバがxmlファイルに書かれていることを検出する方法

WEjpon

総合スコア88

XML

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

C#

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

1グッド

0クリップ

投稿2020/08/17 08:10

前提・実現したいこと

c#のXmlSerializerでxmlファイルを読み込む際、クラスに存在しないメンバがxmlファイルに書かれていることを検出したいです。

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

下記のc#コードで下記xmlファイルを読むと、エラーが出ることなくlistにはPerson 1,2が入ります。
これを、エラーを出す(検出できる)ようにしたいです。

該当のソースコード

c#

1 public class Team 2 { 3 public List<Person> list; 4 5 public static Team Load(string filepath) 6 { 7 try 8 { 9 XmlSerializer serializer = new XmlSerializer(typeof(Team)); 10 StreamReader sr = new StreamReader(filepath, new UTF8Encoding(false)); //ファイルを開く 11 Team ret = (Team)serializer.Deserialize(sr); //XMLファイルから読み込み、逆シリアル化する 12 sr.Close();//閉じる 13 return ret; 14 } 15 catch 16 { 17 return null; 18 } 19 } 20 } 21 22 public class Person 23 { 24 public string id; 25 public string name; 26 } 27 28 public partial class Form1 : Form 29 { 30 private void button1_Click(object sender, EventArgs e) 31 { 32 Team team = Team.Load("test.xml"); // Load失敗ならnull 33 } 34 } 35

xml

1<?xml version="1.0" encoding="utf-8"?> 2<Team xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 3 <list> 4 <Person> 5 <id>1</id> 6 <name>A</name> 7 </Person> 8 <Person> 9 <id>2</id> 10 <name>B</name> 11 <Person> 12 <id>3</id> 13 <name>C</name> 14 </Person> 15 </Person> 16 </list> 17</Team>
TN8001👍を押しています

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

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

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

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

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

hihijiji

2020/08/17 09:29

XMLファイルの誤りを検出したいってことですか?
WEjpon

2020/08/17 09:40

一言で表現するのが難しいのですが、XMLファイルの誤りを検出したいです。 例えば上記XMLファイルの末尾の</Team>の抜け、という誤りは上記コードで既に検出できていますので、検出したい内容は(正しい表現かわかりませんが)「TeamクラスメンバとXMLファイルの構造が一致しているかどうか」ということになると思います。
hihijiji

2020/08/17 10:22

XMLファイルの検証はXMLSchema(xsd)にて行うのが筋です。 ただしXMLSchemaが用意されていない場合には、正しいXMLファイルがあれば、 XMLファイルから生成することが可能です。 また、シリアライズ先のクラスもXMLファイルからの自動生成が便利です。 本来は定義(XMLSchema)ありきで、データ(XMLファイル)も実装(クラス)もそれを元に 作るのが原則であることだけは忘れないでください。 以上、考え方のアドバイスだけで回答ではありません。
WEjpon

2020/08/17 23:49

ありがとうございます。XMLSchemaを知りませんでしたので、確認させていただきます。
guest

回答1

0

ベストアンサー

XmlSerializer.UnknownNode イベント (System.Xml.Serialization) | Microsoft Docs
これはどうでしょう?
提示の例ではエラーにできました。

cs

1public class Team 2{ 3 public List<Person> list; 4 5 public static Team Load(string filepath) 6 { 7 try 8 { 9 var serializer = new XmlSerializer(typeof(Team)); 10 serializer.UnknownNode += (s, e) => throw new Exception(); 11 //serializer.UnknownAttribute += (s, e) => throw new Exception(); 12 //serializer.UnknownElement += (s, e) => throw new Exception(); 13 14 using(var sr = new StreamReader(filepath, new UTF8Encoding(false))) 15 { 16 return (Team)serializer.Deserialize(sr); 17 } 18 } 19 catch 20 { 21 return null; 22 } 23 } 24}

投稿2020/08/17 10:16

編集2023/07/23 04:11
TN8001

総合スコア9862

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

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

WEjpon

2020/08/18 00:03

ありがとうございます。 こちらVisualStudio2010のためかいただいたコードそのままはビルドできませんでしたが、参考にさせていただき下記コードにて今回のxmlファイルの問題は検出できました。 ```C# public class Team { public List<Person> list; public static Team Load(string filepath) { try { var serializer = new XmlSerializer(typeof(Team)); serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode); using (var sr = new StreamReader(filepath, new UTF8Encoding(false))) { return (Team)serializer.Deserialize(sr); } } catch { return null; } } private static void serializer_UnknownNode(object sender, XmlNodeEventArgs e) { } } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問