VB.NETでもXMLを扱いたい(その6)

はじめに

ちょっと前にXmlDocument + XPathXMLの解析をダラダラとやった記事を書きました。

jyuch.hatenablog.com

個人的には正直あれでいいかなーと言った感じでしたが、

『えーまじXmlDocument』『キモーイ』『XmlDocumentが許されるのは小学生までだよねー』『キャハハ』

という意見を受け取ったのと、VBC#に対して唯一勝っているXMLリテラルを軽く試す為にXDocumentで書き直しました。

内容が無いよう

若干出力が違うものの、やりたいことはその5と同じです。

Imports <xmlns:jm="http://jyuch.com/mailbox">

Module Module1

    Sub Main()
        Dim doc = XDocument.Load("mailbox.xml")

        Dim xss = New XmlSchemaSet()
        Using r = New IO.StreamReader("mailbox.xsd")
            Dim xs = XmlSchema.Read(r, Nothing)
            xss.Add(xs)
        End Using

        doc.Validate(xss, Nothing)

        For Each it In doc.<jm:mailbox>.<jm:mail>
            Console.WriteLine("+----------------------------------------------+")
            Dim from = it.<jm:from>.First
            Console.WriteLine("from name:{0} address:{1}", from.Attribute("name").Value, from.Attribute("address").Value)

            Dim recipient = it.<jm:recipient>.First
            For Each i In recipient.Elements
                Console.WriteLine("{0} name:{1} address:{2}", i.Name.LocalName, i.Attribute("name").Value, i.Attribute("address").Value)
            Next

            Dim subject = it.<jm:subject>.First.Elements.First
            Console.WriteLine("subject type:{0} value:{1}",
                              subject.Name.LocalName,
                              If(subject.Name.LocalName = "text", subject.Value, subject.Attribute("path").Value))

            Dim body = it.<jm:body>.First.Elements.First
            Console.WriteLine("body type:{0} value:{1}",
                              body.Name.LocalName,
                              If(body.Name.LocalName = "text", body.Value, body.Attribute("path").Value))
            Console.WriteLine("+----------------------------------------------+")
        Next
    End Sub

End Module

前回のXmlDocumentを使ったよりかなりすっきりした感じとなっております。 やっぱり新しい奴の方がなんだかんだ言っても書きやすいね。

それで、結果がこちら。

+----------------------------------------------+
from name:alice address:alice@jyuch.com
to name:bob address:bob@jyuch.com
subject type:text value:Hello bob
body type:text value:Who are you?
+----------------------------------------------+
+----------------------------------------------+
from name:bob address:bob@jyuch.com
to name:alice address:alice@jyuch.com
cc name:charile address:charlie@jyuch.com
subject type:file value:Re_Hello_bob.txt
body type:text value:I fine thank you. And you.
+----------------------------------------------+
+----------------------------------------------+
from name:alice address:alice@jyuch.com
to name:bob address:bob@jyuch.com
bcc name:dave address:dave@jyuch.com
subject type:text value:Re:Re:Hello bob
body type:file value:I_Fine_Thank_you.txt
+----------------------------------------------+

『クエリ構文なんて無かったんや』と言わんばかりに無視されるクエリ構文ですが、正直VBのクエリ構文は個人的にクッソ分かりずらいのであまり好きではありません。 サンプル少ないしね。

おわり