質問するログイン新規登録

回答編集履歴

1

サンプルコード

2017/05/23 08:30

投稿

tamoto
tamoto

スコア4437

answer CHANGED
@@ -4,4 +4,83 @@
4
4
  シリアライザというのは、C#内の「オブジェクト」とC#外の「XML」を一対一に対応させるためのものです。なので、マッピング先のクラスの構造が異なっていれば当然デシリアライズ操作は失敗します。
5
5
  シリアライザを利用するのであれば、マッピング対象のクラス側(`ReadingXML.Audit`)に`Version`プロパティを追加する必要があります。
6
6
 
7
- XMLを「データソース」と見なしてそれを読み込む用途であれば、`XElement`クラスとその周辺(System.Xml.Linq名前空間)の利用をオススメします。こちらはXMLの「解析」「読み込み」を行うものなので、マッピング操作そのものを自分で書くことができます。
7
+ XMLを「データソース」と見なしてそれを読み込む用途であれば、`XElement`クラスとその周辺(System.Xml.Linq名前空間)の利用をオススメします。こちらはXMLの「解析」「読み込み」を行うものなので、マッピング操作そのものを自分で書くことができます。
8
+
9
+ ---
10
+
11
+ 追記:
12
+
13
+ Linq to XMLを使用してXMLを読み込むサンプルを書いてみました。
14
+ 丸ごとコピーでコンパイル/実行可能なようにしてあります。
15
+
16
+ 質問のXMLデータをそのまま使用しています。が、XMLを書く時はインデントルールを決めて間違いなく記述することで、全体の構造を把握しやすくなります。
17
+ ```xml
18
+ <?xml version="1.0" encoding="UTF-8"?>
19
+ <Audit xmlns="http://xxx"
20
+ xmlns:xsi="http://yyy"
21
+ xsi:schemaLocation="zzz">
22
+ <Version>11.2</Version>
23
+ <AuditRecord>
24
+ <Audit_Type>1</Audit_Type>
25
+ </AuditRecord>
26
+ <AuditRecord>
27
+ <Audit_Type>1</Audit_Type>
28
+ </AuditRecord>
29
+ <AuditRecord>
30
+ <Audit_Type>1</Audit_Type>
31
+ </AuditRecord>
32
+ <AuditRecord>
33
+ <Audit_Type>1</Audit_Type>
34
+ </AuditRecord>
35
+ <AuditRecord>
36
+ <Audit_Type>1</Audit_Type>
37
+ </AuditRecord>
38
+ </Audit>
39
+ ```
40
+
41
+ マッピングクラスは不要なので、AuditRecordクラスしか残りませんでした。
42
+ 他にも必要なデータがあれば、Root(xml変数)から好きなように掘ってください。
43
+ ```csharp
44
+ using System;
45
+ using System.Linq;
46
+ using System.Xml.Linq;
47
+
48
+ namespace ReadingXML
49
+ {
50
+ class Program
51
+ {
52
+ static void Main(string[] args)
53
+ {
54
+ var filePath = @"test.xml";
55
+
56
+ // xmlをロード
57
+ var xml = XElement.Load(filePath);
58
+ var ns = xml.GetDefaultNamespace(); // namespace
59
+
60
+ // AuditRecordエレメントを全て取得
61
+ var xmlRecords = xml.Elements(ns + "AuditRecord");
62
+
63
+ // AuditRecordオブジェクトに変換
64
+ var records = xmlRecords.Select(record => new AuditRecord
65
+ {
66
+ Audit_Type = record.Element(ns + "Audit_Type").Value,
67
+ // XXX = record.Element(ns + "xxx").Value,
68
+ // YYY = ...
69
+ }).ToList();
70
+
71
+ // 出力テスト
72
+ foreach (var record in records)
73
+ Console.WriteLine(record.Audit_Type); // 1, 1, 1, 1, 1
74
+ }
75
+
76
+ public class AuditRecord
77
+ {
78
+ public String Audit_Type { get; set; }
79
+
80
+ // public String XXX { get; set; }
81
+
82
+ // public String YYY...
83
+ }
84
+ }
85
+ }
86
+ ```