暇に感けて装いも新たに・・・なっていないとりこらぼですが、いかがお過ごしでしょうか?とりこびとです、こんにちは♪
前回はXML へのアクセスについておべんきょしたことを書きました。
Visual Basic 2008 の新機能 - XML その3(XML へのアクセス。) -
ここまでVisual Basic 2008では XML リテラルがサポートされていろいろ出来るよってことを知ることができましたが、あくまでVisual Basic 2008 の新機能なわけなんですよね。言語の新機能なのです。ってことはコンパイラさんがいろいろやってくれている感じですよね?よね?
・・・気になる。
というわけでこの XML、仕組みを調べてみようと思います。MSDNでは、
MSDN : XML リテラルの概要
に、「コンパイラによる XML リテラルからのオブジェクトの作成方法 」っていうのがありますね。言語仕様だと、ここらあたり↓です。
Visual Basic Language Specification Version 9.0 : 11.23 XML Literal Expressions
なるほど、Visual Basic コンパイラさんはSystem.Xml.Linq 名前空間に含まれるクラスを使用したコードに変換するわけですね。XElement クラスや、XAttribute クラスなどなど、です。
じゃ、以下のコードはどう変換されるのでしょう?自力で置き換えてみます。
Option Strict On
Option Infer On
Imports System.Xml.Linq
Module Program
Sub Main()
Dim ちら裏 = _
<ちら裏>
<ソルジャー>
<Name>ながせ</Name>
<Url Type="わんくま">http://blogs.wankuma.com/nagase/</Url>
<Url Type="ちら裏">http://d.hatena.ne.jp/udongein/</Url>
</ソルジャー>
<ソルジャー>
<Name>とりこびと</Name>
<Url Type="わんくま">http://blogs.wankuma.com/torikobito/</Url>
<Url Type="ちら裏">http://d.hatena.ne.jp/torikobito/</Url>
</ソルジャー>
</ちら裏>
End Sub
End Module
さっそくXElement クラスから作成して・・・コンストラクタにまたXElement クラスを渡せるのね。あ、XName クラスってのを渡せるのか、これがベタな作り方かな?・・・ってXName クラスにはパブリックコンストラクタ無いやん・・・。orz
まぢまぢ見てみます↓まぢまぢまぢまぢまぢまぢまぢまぢ。
MSDN : XName クラス
XName には、パブリック コンストラクタが用意されていません。代わりに、このクラスでは、String からの暗黙の型変換を実行して、XName を作成できます。
どうやら、XName クラスはString型から暗黙の型変換できる様子です。
さらにまぢまぢ見てみます↓まぢまぢまぢまぢまぢまぢまぢまぢ。あれ?こんなのもある・・・。
MSDN : XName.Get メソッド(# っていうか、何をGetするのやら・・・。)
このメソッドには、XName を作成できるようにするオーバーロードが用意されています。このオブジェクトは、"{namespace}localname" という形式の拡張 XML 名を指定する方法でも、名前空間とローカル名を個別に指定する方法でも作成できます。
より一般的で簡単な XName の作成方法は、文字列からの暗黙の型変換を使用することです。
あ、そうですか。でもXNameで書いちゃいますw・・・えっとルートは'ちら裏'ですね・・・ごそごそごそごそ・・・。
Option Strict On
Option Infer On
Imports System.Xml.Linq
Module Program
Sub Main()
Dim ちら裏 = New XElement(XName.Get("ちら裏"))
Dim ながせさん = New XElement(XName.Get("ソルジャー"))
ながせさん.Add(New XElement(XName.Get("Name"), "ながせ"))
Dim ながせさんのURL = New XElement(XName.Get("Url"), "http://blogs.wankuma.com/nagase/")
ながせさんのURL.Add(New XAttribute(XName.Get("Type"), "わんくま"))
ながせさん.Add(ながせさんのURL)
ながせさんのURL = New XElement(XName.Get("Url"), "http://d.hatena.ne.jp/udongein/")
ながせさんのURL.Add(New XAttribute(XName.Get("Type"), "ちら裏"))
ながせさん.Add(ながせさんのURL)
ちら裏.Add(ながせさん)
Dim とりこびと = New XElement(XName.Get("ソルジャー"))
とりこびと.Add(New XElement(XName.Get("Name"), "とりこびと"))
Dim とりこびとのURL = New XElement(XName.Get("Url"), "http://blogs.wankuma.com/torikobito/")
とりこびとのURL.Add(New XAttribute(XName.Get("Type"), "わんくま"))
とりこびと.Add(とりこびとのURL)
とりこびとのURL = New XElement(XName.Get("Url"), "http://d.hatena.ne.jp/torikobito/")
とりこびとのURL.Add(New XAttribute(XName.Get("Type"), "ちら裏"))
とりこびと.Add(とりこびとのURL)
ちら裏.Add(とりこびと)
End Sub
End Module
こんな感じですかね・・・疲れた・・・。orz
というわけで、XML リテラルってのは、Visual Basic コンパイラさんが私のためにけっこうがんばってくれてる感じですね♪