Silverlight をインストールするには、ここをクリックします*
Japan変更|すべてのMicrosoft のサイト
MSDN
|MSDN ライブラリ|デベロッパー センター|ダウンロード情報|開発ツール製品|コミュニティ|ご意見・ご要望|サイトマップ
MSDN Home > MSDN アカデミック アライアンス > 第 3 回:Visual C# による簡易 XML エディタ

第 3 回:Visual C# による簡易 XML エディタ

〜 Visual C# による XML チュートリアル 〜

3.1 はじめに

第 2 章では、Visual C# .NET による XML 文書の入出力や操作方法について解説しました。Visual C# .NET には、XML 文書を操作するための機能が用意されており、容易に XML 文書を扱えることが理解できたと思います。プログラミング言語を習得するには、試行錯誤を繰り返し、数多くのプログラムを作成することが大切です。これは、Visual C# .NET を理解することにおいても同じことが言えます。そこで、第 3 章では、今までに学んだ Visual C# .NET による XML 文書の操作方法を利用し、簡易 XML エディタの作成を行います。簡易 XML エディタとは、XML 文書を読み込み、修正するためのプログラムです。前半では、簡易 XML エディタに利用するコントロールやアルゴリズムについて説明し、後半では、Visual C# .NET による簡易 XML エディタの作成方法について解説します。

3.2 簡易 XML エディタに利用する技術

本節では、簡易 XML エディタを開発するための技術として、利用するコントロールやアルゴリズムについて解説します。本節で解説する技術は、TreeView コントロール、再帰呼び出しのアルゴリズム、XPath です。

3.2.1 TreeView コントロール

簡易 XML エディタでは、XML 文書を表示するために、TreeView コントロールを使用します。XML 文書は、階層構造で構成されています。XML 文書のような階層構造を表現するには、TreeView コントロールを利用するのが一般的です。例えば、TreeView コントロールは、Windows エクスプローラの左ペインへファイルやフォルダを表示するために利用されます。TreeView コントロールの表示形式は、ツリーノードと呼ばれる要素で階層を表示します。TreeView コントロールの利用例を図 1 に示します。

図 1 TreeView コントロールの利用例

図 1 TreeView コントロールの利用例

TreeView コントロールの操作方法を次に示します。

(1) ツリーノードの取得

ツリーノードとは、TreeView コントロールの階層構造を構成する一つ一つの要素です。ツリーノードを操作するには、TreeNode クラスを利用します。TreeNode クラスのプロパティやメソッドを利用するには、TreeNode クラスのインスタンスを必要とする場合があります。TreeNode クラスのインスタンスを生成する構文を次に示します。

TreeNode ツリーノード名 = new TreeNode("ノードの内容");

TreeNode クラスからは、ツリーノードに対する新ノードや子ノードを取得することができます。ツリーノードの取得に使用する主要なプロパティを表1に示します。

表 1 ツリーノードの取得に使用する主要なプロパティ

プロパティ名説明
FirstNode最初の子ツリーノードを取得します
LastNode最後の子ツリーノードを取得します
PrevNode同じ階層の兄弟ツリーノードの内、直前のツリーノードを取得します
NextNode同じ階層の兄弟ツリーノードの内、直後のツリーノードを取得します
Parent現在のツリーノードの親ツリーノードを取得します
Nodes現在のツリーノードに割り当てられている子ツリーノードのコレクションを取得します

ツリーノードは、階層構造になっており、その構造を理解することが非常に重要です。ツリーノードの概念図を図2に示します。

図 2 ツリーノードの概念図

図 2 ツリーノードの概念図

ツリーノードを取得するには、プロパティを組み合わせて使用します。ツリーノード名 「root」 の最初の子ツリーノードのコレクションを取得するコード例を次に示します。

root.FirstNode.Nodes

(2) ツリーノードの追加

ツリーノードを追加するには、TreeView クラスの Nodes プロパティの Add メソッドを利用します。ツリーノードを追加する構文を次に示します。

ツリーノード.Nodes.Add(ツリーノード名);

(3) ツリーノードの削除

ツリーノードを削除するには、TreeView クラスの Nodes プロパティの Remove メソッドを利用します。ツリーノードを削除する構文を次に示します。

ツリーノード.Nodes.Remove(ツリーノード名);

Visual C# .NET による TreeView コントロールの操作例を次に示します。

private void button1_Click(object sender, System.EventArgs e)
{
    TreeNode rootNode = new TreeNode("ルートノード");   // インスタンスの生成
treeView1.Nodes.Add(rootNode);            // ルートツリーノードの追加
    rootNode.Nodes.Add("子ツリーノード");            // ツリーノードの追加 
} 

上記のコードの実行結果を図 3 に示します。

図 3 実行結果

図 3 実行結果

3.2.2 再帰呼び出し

簡易 XML エディタでは、XML 文書を読み込み、TreeView コントロールに表示するために、再帰呼び出しのアルゴリズムを利用します。再帰呼び出しとは、サブルーチンの中から、さらに関数である自分自身を呼び出すような処理を指します。再帰呼び出しの利点は、複雑な処理を非常に単純なコードで実現できることです。具体的には、階層構造をもつデータの走査や数学の階乗計算などに用いられます。再帰呼び出しの例を次に示します。

private void ShowRecursive(TreeNode treeNode) // 特定のツリーノードのテキストをすべて表示
{
   MessageBox.Show(treeNode.Text);// ツリーノードのテキストをMessageBoxに表示
   foreach (TreeNode Newnode in treeNode.Nodes) // ツリーノードの走査
   {
      ShowRecursive(Newnode);   // 再帰呼び出し
   }
}

3.2.3 XPath

XPath とは、XML 文書の特定の部分を指し示すパスを記述する言語です。例えば、要素 A の下の階層の要素Bを指し示す場合、XPath では、「/A/B」 と記述します。XML 文書と Xpath の関係を図 4 に示します。

図 4 XML 文書と Xpath の関係

図 4 XML 文書と Xpath の関係

Visual C# .NET では、XMLDocument クラスの SelectNodes メソッドや Single SelectNode メソッドの引数に XPath を渡すことにより、任意のノードを取得できます。

3.3 簡易 XML エディタの作成

本節では、実際に簡易 XML エディタの作成を行います。簡易 XML エディタは、既存の XML 文書を読み込み、TreeView コントロールに表示し、TreeView コントロールよりXML 文書を修正するプログラムです。簡易 XML エディタの作成手順は、XML 文書の用意、新しいプロジェクトの作成、インタフェースの作成、ソースコードの追加、簡易 XML エディタの実行です。

(1) XML 文書の用意

最初に、本プログラムで使用する XML 文書を用意します。XML 文書は、テキストエディタで次の文書を記述し作成します。本プログラムで使用する XML 文書を次に示します。

<?xml version="1.0" encoding="Shift_JIS"?>
<season>
   <spring>
      <january>1月</january>
      <february>2月</february>
      <march>3月</march>
   </spring>
   <summer>
      <april>4月</april>
      <may>5月</may>
      <june>6月</june>
   </summer>
   <autumn>
      <july>7月</july>
      <august>8月</august>
      <september>9月</september>
   </autumn>
   <winter>
      <october>10月</october>
      <november>11月</november>
      <december>12月</december>
   </winter>
</season>

(2) 新しいプロジェクトの作成

次に、新しいプロジェクトを作成します。まず、新しいプロジェクトの作成には、メニューから【ファイル】→【新規作成】→【プロジェクト】を選択します。次に、【Visual C# プロジェクト】→【Windows アプリケーション】を選択します。最後に、プロジェクト名と保存場所を指定し、【OK】ボタンを押します。

(3) インタフェースの作成

次に、Visual C# .NET のデザイン画面よりプログラムのインタフェースを作成します。簡易 XML エディタのインタフェースを図 5 に示します。

図 5 簡易 XML エディタのインタフェース

図 5 簡易 XML エディタのインタフェース

(4) ソースコードの追加

次に、ソースコードを追加します。まず、XML 文書を操作するため、Form1 のソースコードへ XML 名前空間の参照を追加します。XML 名前空間の参照を図6に示します。

図 6 XML 名前空間の参照

図 6 XML 名前空間の参照

次に、XMLDocument クラスを利用するため、インスタンスを生成します。 XMLDocument クラスのインスタンス生成コードを図 7 に示します。

図 7 XMLDocument クラスのインスタンス生成コード

図 7 XMLDocument クラスのインスタンス生成コード

次に、button1_Click イベントハンドラおよび button2_Click イベントハンドラ、button3_Click イベントハンドラへコードを記述します。Form1 に作成した button1 コントロールおよび button2 コントロール、button3 コントロールをそれぞれダブルクリックし、コードを追加します。各ボタンのイベントハンドラに記述するコードを次に示します。

private void button1_Click(object sender, System.EventArgs e) // 読み込みボタン
{
openFileDialog1.ShowDialog();            // 【ファイルを開く】ダイアログの表示
    myXmlDocument.Load(openFileDialog1.FileName);    // XML文書の読み込み
    XmlNode rootXmlNode = 
myXmlDocument.DocumentElement;    // XMLファイルのルートノードの参照
    TreeNode rootTreeNode = 
new TreeNode(rootXmlNode.Name);    //TreeNode クラスのインスタンス生成
    treeView1.Nodes.Add(rootTreeNode);        // ツリーノードのルートノードの作成
    RecursiveShowTree(rootXmlNode, rootTreeNode);  // ツリーノード化関数呼び出し
    treeView1.ExpandAll();            // すべてのツリーノードを展開
}
private void button2_Click(object sender, System.EventArgs e) // 修正ボタン
{
// 選択したツリーノードへのフルパス
string sPathForTree = treeView1.SelectedNode.FullPath;    
    int iNodeIndex = treeView1.SelectedNode.Index;  // 選択したツリーノードのノード番号
    sPathForTree = sPathForTree.Replace("\\","/"); // フルパスの正規化
    //XmlNodeの参照
XmlNode selectedXmlNode = 
myXmlDocument.SelectNodes("/" + sPathForTree).Item(iNodeIndex);
    if(selectedXmlNode == null)  // 例外処理
    {
        selectedXmlNode = myXmlDocument.SelectNodes("/" + sPathForTree).Item(0);
    }
    selectedXmlNode.InnerText = textBox1.Text;  // テキスト領域の修正
}

private void button3_Click(object sender, System.EventArgs e) // 保存ボタン
{
    saveFileDialog1.ShowDialog();  // 【名前を付けて保存】ダイアログの表示
    myXmlDocument.Save(saveFileDialog1.FileName);  // XML文書の保存
}

次に、XML 文書をツリーノードに展開するため、再帰呼び出しのコードを追加します。再帰呼び出しのコードを次に示します。

private void RecursiveShowTree(XmlNode Parentnode,TreeNode ParenttreeNode)
{
    foreach(XmlNode childXmlNode in Parentnode.ChildNodes)
    {
        if(childXmlNode.Name != "#text")        // テキストノードへの処理
        {
// ツリーノードの追加
        TreeNode childTreeNode = ParenttreeNode.Nodes.Add(childXmlNode.Name);
        RecursiveShowTree(childXmlNode,childTreeNode); // 再帰呼び出し
        }
    }
}

最後に、treeView1_AfterSelect イベントハンドラへコードを追加します。treeView1_AfterSelect イベントハンドラを作成するには、TreeView のプロパティより AfterSelect イベントを選択し、イベントハンドラ名を treeView1_AfterSelect に指定します。treeView1_AfterSelect イベントハンドラの作成方法を図8に示します。

図 8 treeView1_AfterSelect イベントハンドラの作成方法

作成したtreeView1_AfterSelect イベントハンドラへコードを追加します。treeView1_AfterSelect イベントハンドラのコードを次に示します。

private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
string sPathForTree = e.Node.FullPath; // 選択したツリーノードへのフルパス
    int iNodeIndex = treeView1.SelectedNode.Index; // 選択したツリーノードへのノード番号
    sPathForTree = sPathForTree.Replace("\\","/"); // フルパスの正規化
// XmlNodeの参照
    XmlNode selectedXmlNode = 
myXmlDocument.SelectNodes("/" + sPathForTree).Item(iNodeIndex);
    if(selectedXmlNode == null) // 例外処理
    {
        selectedXmlNode = myXmlDocument.SelectNodes("/" + sPathForTree).Item(0);
    }
    textBox1.Text = selectedXmlNode.InnerText;  // 選択したツリーノードの値の表示
}

(5) 簡易 XML エディタの実行

最後に、簡易 XML エディタを実行します。簡易 XML エディタは、XML 文書のテキスト要素を修正するためのプログラムです。簡易 XML エディタは、XML 文書を読み込み、TreeView コントロールのツリーノードにXML 文書構造を表示します。ユーザは、展開されたツリーノードを選択し、TextBox よりテキストを修正します。簡易 XML エディタの実行画面を図 9 に示します。

図 9 簡易 XML エディタの実行画面

図 9 簡易 XML エディタの実行画面

最後に、修正したXML 文書をInternetExplorerで表示します。修正したXML 文書の表示を図 10 に示します。

図 10 修正したXML 文書の表示

図 10 修正したXML 文書の表示

3.4 まとめ

本章では、Visual C# .NET による簡易 XML エディタの作成方法について解説しました。

簡易 XML エディタの作成を通じて、今までに学んだ XML 文書の入出力や操作方法への理解が深まったと思います。

XML は、普及が進むにつれ、関連した様々な技術を誕生させました。例えば、XMLのサブセット言語には、画像データフォーマットの SVG (Scalable Vector Graphics) やマルチメディアコンテンツ記述用言語の SMIL (Synchronized Multimedia Integration Language) などが挙げられます。また、XML 関連規格には、プログラムインタフェースの DOM や SAX、企業間電子商取引の BizTalk などが挙げられます。これらの技術や規格には、XMLと同様に高い関心が寄せられています。その中でも、次回は、XML によるデータ交換のプロトコルとして注目を集めている SOAP (Simple Object Access Protocol) について解説します。


著者紹介

田中 成典 (たなか しげのり)

1986年関西大学工学部土木工学科卒業
1988年関西大学大学院工学研究科 土木工学専攻博士課程前期課程修了
1996年博士 (工学) 授与,関西大学
1997年関西大学総合情報学部助教授 (現在に至る)
主な著書:やさしいCのはじめかた,オーム社,1993年
 建設技術者のための知識情報処理の実践,関西大学出版部,1999年
 DirectX8,工学社,2001年
 ステップアップXML,工学社,2002年
 Linuxアプリケーション入門,森北出版,2002年    ほか

中山 浩太郎 (なかやま こうたろう)

2001年3月関西大学総合情報学部卒業
2001年4月関西大学大学院総合情報学研究科入学 (現在に至る)
2002年4月同志社女子大学非常勤講師 (現在に至る)
主な著書:Web工房シリーズ Perlの達人,森北出版,1999年
 DirectX8,工学社,2001年
 Linuxアプリケーション入門,森北出版,2002年    ほか

石井 健一 (いしい けんいち)

1999年4月関西大学総合情報学部総合情報学科入学 (現在に至る)
主な著書:ステップアップXML活用法,工学社,2002年

野中 一希 (のなか かずき)

1999年4月関西大学総合情報学部総合情報学科入学 (現在に至る)
2002年1月株式会社関西総合情報研究所入社 (現在に至る)

中村 健二 (なかむら けんじ)

2000年4月関西大学総合情報学部総合情報学科入学 (現在に至る)
2002年4月株式会社関西総合情報研究所入社 (現在に至る)


Microsoft