xmlをデータベースに

Microsoft Wordを操作 でとりあえず情報収集は可能になった。
ここではXMLをデータベースにして処理する方法をメモしておく。

参考サイト

XMLの作成 〜LinqtoXML利用〜
Imports Microsoft.Office.Interop
Imports System.Runtime.InteropServices.Marshal
Imports System.Xml
Imports System.Xml.Linq
---
Module test
    Sub test()
        Dim oWord As Word.ApplicationClass
        oWord = CreateObject("Word.Application")
        oWord.Visible = True

        Dim doc As New XDocument()
        Dim Dec As New XDeclaration("1.0", "UTF-8", True) 'XML宣言の作成
        doc.Declaration = Dec
        Dim root As New XElement("root")
        doc.Add(root) 'ルートノードを追加  

        Dim xItem, xRow, xColumn, xText As XElement '各エレメントを定義

        Dim FilePath As String = String.Empty
        For Each FilePath In Form1.FL 'FLに処理するファイルのフルパスを入れておく

            Dim wDoc As Word.Document 'ワードドキュメントを定義
            wDoc = oWord.Documents.Open(FilePath) 'ドキュメントを開く

            Dim temStr, smartStr, sortID As String
            Dim wRow, wCol, Category, MaxRow As Integer
            sortID = "none" : MaxRow = 0 'MaxRow・・・Table が複数ある場合、ForEach で次の Table に移ると.RowIndex が1に戻ってしまうため設定した。
            For Each wTable As Word.Table In wDoc.Tables 'ドキュメントの表(Tables)の1つを取得
                For Each wCell As Word.Cell In wTable.Range.Cells '表内の1つ(Cell)を取得
                    temStr = Replace(wCell.Range.Text, vbCr & Chr(7), String.Empty) '値を取得する場合は「Value」ではなく「.Range.Text」、改行と・を置換
                    If temStr = (String.Empty) OrElse (temStr = "") Then Continue For '文字列が空なら処理を飛ばし、次の文字列へ

                    wRow = wCell.RowIndex + MaxRow : wCol = wCell.ColumnIndex '行・列を取得

                    smartStr = Form1.textSmart(temStr) '文字列整形ファンクション
                    Category = Form1.fnConJudge(smartStr) 'カテゴリ判別ファンクション
                    sortID = Form1.fnSortID(smartStr) 'sortID判別ファンクション

                    '□□□xmlにデータを入力していく
                    xItem = New XElement("Item") 'Itemノードのインスタンスを作成  
                    xItem.SetAttributeValue("Category", Category) 'ItemノードにCategory属性と属性値としてCategoryを追加
                    root.Add(xItem) 'rootノードにItemノードを子ノードとして追加

                    xText = New XElement("Text") 'Textノードのインスタンスを作成  
                    xText.SetAttributeValue("smartText", smartStr) 'TextノードにsmartText属性と属性値としてsmartStrを追加
                    xItem.Add(xText) 'ItemノードにTextノードを子ノードとして追加

                    xRow = New XElement("Row") 'Rowノードのインスタンスを作成   
                    xRow.Value = wRow 'Rowノードに値を追加
                    xItem.Add(xRow) 'ItemノードにRowノードを子ノードとして追加

                    xColumn = New XElement("Column") 'Columnノードのインスタンスを作成   
                    xColumn.Value = wCol 'Columnノードに値を追加
                    xItem.Add(xColumn) 'ItemノードにColumnノードを子ノードとして追加

                Next wCell
                MaxRow = wRow
            Next wTable

            wDoc.Close(SaveChanges:=False) 'ドキュメントを閉じる(変更は無視する)
            ReleaseComObject(wDoc) 'メモリ開放

        Next

        oWord.Quit() 'ワードアプリケーション終了
        ReleaseComObject(oWord) 'メモリ開放
        oWord = Nothing

        '□□□クエリを作成
        Dim Query2 = From C In root.Elements("Item") Where (C.@Category = "1") OrElse (C.@Category = "2") _
                        Let Row = CInt(C.Element("Row").Value) _
                        Let Col = CInt(C.Element("Column").Value) + 1 _
                        Let Col2 = CInt(C.Element("Column").Value) + 2 _
                        From D As XElement In root.Elements("Item") _
                        Where D.Element("Row").Value = Row AndAlso D.Element("Column").Value = Col _
                        From F As XElement In root.Elements("Item") _
                        Where F.Element("Row").Value = Row AndAlso F.Element("Column").Value = Col2 _
                        Select base = C.Element("Text").@smartText, target = D.Element("Text").@smartText, _
                        target2 = F.Element("Text").@smartText, Cate = C.@Category, FName = C.@FileName, SID = C.@sortID

        'From C 以下
        'ItemノードのCategory属性が1または2なら
        'Rowの値はItem/Rowノードの値を取得
        'Colの値はItem/Columnノードの値に1を加算したものを取得
        'Col2の値はItem/Columnノードの値に2を加算した物を取得

        'From D 以下
        'Rowノードの値がRowと同じ且つColumnノードの値がColと同じItemノードを指定

        'From F以下
        'Rowノードの値がRowと同じ且つColumnノードの値がCol2と同じItemノードを指定

        'Select 以下
        'base:ベースアイテム
        'target:RowおよびColが一致したテキスト
        'target2:RowおよびCol2が一致したテキスト
        'Cate:Cateboryテキスト
        'FName:FileNameテキスト
        'SID:sortIDテキスト

        Dim wDataList As New List(Of String) 'データリストを作成

        '□□□クエリからデータをリストへ入力
        For Each Item In Query2 'データリストにデータを入れていく
            Select Case (Item.Cate)
                Case 1
                    wDataList.Add(Item.base & "@" & Item.target & "@-")
                Case 2
                    wDataList.Add(Item.base & "@" & Item.target & "@" & Item.target2)
            End Select
            Console.WriteLine(Item)
        Next
        wDataList.Sort()

    End Sub
End Module