テキスト篇:p.416「XMLデータとLINQ」から
ゲーム開発演習:敵機の出現と移動、衝突判定、ゲームオーバー など
p.416(XMLとは)
・XMLはエクステンシブル(拡張可能な)マークアップランゲージの略で、Webページの記述に用いるHTMLに近いマークアップ言語 ・マークアップ言語は文字列情報に<>で挟んだタグと呼ばれる制御情報を与える仕組み ・HTMLの場合は、Webブラウザで定められたタグを用いて、文字色や画像挿入などを指定できる 例: <HTML><HEAD>…<BODY>ここは<b>太字</b></BODY></HTML> ・XMLの場合は、汎用であり、作成者が自由に定めたタグを用いて、構造情報を持つ文書を作成できる 例: <?xml … ?><book><title>題名</title><bookbody>本文</bookbody></book> ・よって、ゲームなどの大量の文字列情報を用いるアプリにおいて、これをXML形式で表現する例が増えている ・XML形式の文書の先頭行には<?xml version="1.0" encoding="文字コード" ?>を置く ・文字コードは主にuft-8を用いることが多い
p.416 XMLデータとLINQ
・LINQのクエリ対象としてXMLデータが利用可能
・Visual Studioにおいて、下記の準備作業が必要
①ソリューションエクスプローラで「参照」を右クリックし「参照の追加」
②「System.Xml」と「System.Xml.Linq」のチェックをオンにして「OK」
・外部のXMLファイルの読込には、System.Xml.Linq.XElementクラスの静的メソッド XElement Load("ファイル名")を用いる
例(using済): XElement x = Load("myxmlsfile.xml");
・クエリ式ではin句において、XElementクラスのインスタンスメソッドElements()でコレクションを得て用いる
・where/orderby句では、XElementクラスのインスタンスメソッドElement("タグ名")でタグへの参照(コンテナ)を得て、
Valueプロパティで文字列を受け取る
・コンテナはXContainerクラス型なので、そこにValueプロパティがある
・クエリ結果の取り出しのforeachにおいても、Element("タグ名").Valueを用いる
p.416 students.xml(プロジェクトのbin/debugフォルダに置く)
<?xml version="1.0" encoding="utf-8" ?> <data> <student> <name>山田太郎</name> <id>100</id> <point>56</point> </student> <student> <name>上野義男</name> <id>101</id> <point>80</point> </student> <student> <name>岡田一郎</name> <id>102</id> <point>70</point> </student> <student> <name>吉田和夫</name> <id>103</id> <point>95</point> </student> </data>
p.417 xml01.cs
//p.417 xml01.cs
using System;
using System.Linq; //クエリ式用
using System.Xml.Linq; //XElementクラス用
class xml01 {
public static void Main() {
XElement students = XElement.Load("student.xml"); //XMLファイルの読込
var q =
from person in students.Elements() //XMLエレメンツから
where int.Parse(person.Element("point").Value) >= 60 //要素値の条件式
orderby person.Element("point").Value descending //要素値で整列(降順)
select person; //エレメンツを得て返す
foreach (var p in q) { //pはXElement型になる
Console.WriteLine("{0}, {1}, {2}",
p.Element("name").Value, //(コンテナで)要素値を得て用いる
p.Element("point").Value,
p.Element("id").Value);
}
}
}
p.419(XMLデータとラムダ式によるLINQ)
・XMLデータに対するLINQでの問合せも、メソッド構文にしてラムダ式にすると見やすくなる
・書式例: 参照変数.Elements().Where(x => x.Element("タグ").Valueの条件式).Select(x => x);
p.419 xml02.cs
//p.419 xml02.cs
using System;
using System.Linq; //クエリ式用
using System.Xml.Linq; //XElementクラス用
class xml02 {
public static void Main() {
XElement Students = XElement.Load("student.xml"); //XMLファイルの読込
var q = Students.Elements()
.Where(x => int.Parse(x.Element("point").Value) >= 60) //ラムダ式
.OrderByDescending(x => x.Element("point").Value) //ラムダ式
.Select(x => x); //ラムダ式 ※Valueは不要
foreach (var p in q) {
Console.WriteLine("{0}, {1}, {2}",
p.Element("name").Value,
p.Element("point").Value,
p.Element("id").Value);
}
}
}
テキスト編は以上です