XMLファイルを読み込む方法

タグの編集
投稿者 Yuichi  (中学生) 投稿日時 2011/5/21 22:30:51
XMLファイルを読み込む方法がわからないです。
調べてみましたが自分の望む答えではありませんでした。
ある要素の値を取得するだけでいいのですが教えてくれないでしょうか?
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/5/21 23:22:35
> ある要素の値を取得するだけでいいのですが教えてくれないでしょうか?
こういうときは、
 『…というXMLファイルがあって、その中の…の部分を取り出したい』
のように、質問内容を具体的に書いた方が、回答が付きやすいかも。


> 調べてみましたが自分の望む答えではありませんでした。
調べて見つかったものはどのようなもので、
それは何故、望ましいものでは無かったのでしょうか?

何故駄目だったのかを書いてもらわないと、折角回答したところで
それは「望む答えではない」可能性があります。

回答する側としては無駄な労力になりますし、
質問者側も効率が悪いですよね。


> XMLファイルを読み込む方法がわからないです。
XML を読み込む方法は何通りかあります。
また、VB6 と VB.NET2002~2005 と VB2008~VB2010 とでは、
使用できる読み込み方法に差があります。

お使いの環境は何でしょうか?

VB6 なら、MSXML を使うのが一般的です。
 ・「DOM」による読み込み → DOMDocument オブジェクト
 ・「SAX」による読み込み → DOMDocument オブジェクト

VB.NET 系では、System.Xml 名前空間が基本ですが、他にも幾つか方法があります。
 ・テーブルとして読み込み → DataSet クラス
  http://msdn.microsoft.com/ja-jp/library/fx29c3yd.aspx
 ・「DOM」による読み込み → XmlDocument クラス
  http://code.msdn.microsoft.com/10-XML-DOM-VB-a02f6ff4/
 ・順次読み取り専用 → XMLTextReader クラス
  http://code.msdn.microsoft.com/10-XML-ReaderWriter-VB-dd8eb825/

VB2008 以降では、XDocument を使うと便利です。また、言語自体に
XML の埋め込みや読み取り機能が追加されたため、より簡潔に記述できます。


あとはこのあたり。
http://code.msdn.microsoft.com/DataAccess-howto-e287efd1

過去ログも参考にしてみてください。
http://homepage1.nifty.com/rucio/commu/ThreadDetail_ThreadId_9525.htm
投稿者 YuO  (社会人) 投稿日時 2011/5/22 01:53:41
魔界の仮面弁士さんの方法に加えて……。

.NET Frameworkでは,場合によってはXmlSerializerを使ってオブジェクトにデシリアライズしてしまうのが楽な場合もあります。
# オプション設定をオブジェクトで持っていてXMLで読み書きしたい場合など。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/5/23 10:38:33
> XmlSerializerを使ってオブジェクトにデシリアライズしてしまうのが楽な場合もあります。

XmlSerializer を用いた読み込みについては、先に紹介した過去ログ
>> http://homepage1.nifty.com/rucio/commu/ThreadDetail_ThreadId_9525.htm
にて、あにすさんが具体的なサンプルを提示されていますので、参考にしてみてください。

ただし、読み込み対象の XML の構造によっては、XmlSerializer が使えない場合もあります。
(Yuichi さんが読もうとしている XML ファイルがどのような物かは分かりませんけれども)


なお、元のファイルにXML名前空間(xmlns)が含まれている場合には、
<XmlType("contents")> _
Public Class Contents
の部分が、
<XmlType("contents", Namespace="http://example.com/")> _
Public Class Contents
などという指定に変わります。



>> VB6 なら、MSXML を使うのが一般的です。
>>  ・「DOM」による読み込み → DOMDocument オブジェクト
>>  ・「SAX」による読み込み → DOMDocument オブジェクト

すみません、書き間違いです。上記は
  ・「DOM」による読み込み → DOMDocument オブジェクト
  ・「SAX」による読み込み → SAXXMLReader オブジェクト
に読み替えてください。
投稿者 Yuichi  (中学生) 投稿日時 2011/5/23 20:19:40
たくさんの回答ありがとうございました。

仮面の魔界弁士さんの紹介してくれたサイトにアクセスして調べてみましたがよくわかりませんでした。

自分がやりたいのは、

<?xml version="1.0" encoding="utf-8"?>
<foo>test</foo>

上のようなXMLの場合、タグ(?)「foo」を指定するとそれに囲まれている値「test」を取得することです。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/5/23 20:56:28
繰り返しになりますが、質問内容は具体的に書いた方が良いですよ。

> 調べてみましたがよくわかりませんでした。
どの記事のどの部分が分からなかったのか、具体的に質問して頂ければ解説することもできますが、
どこが分からないかも伝えていただけない事には、何を教えれば良いのかも分かりません…。


> 「foo」を指定するとそれに囲まれている値「test」を取得することです。 
MsgBox(XDocument.Load("C:\test.xml").<foo>.Value)


下位の層に、複数の foo があった場合はどうするのか、
名前空間の異なる foo があった場合はどうしたいのか、
foo の中身が空だった場合とfoo が無かった場合を区別する必要があるのか、
そもそも、VB のバージョンは何であるのかなど、情報が不足しているので
上記では要件を満たせないのかもしれませんけれども。
投稿者 Yuichi  (中学生) 投稿日時 2011/5/28 22:07:22
返信が遅くなりました。
魔界の仮面弁士様ありがとうございます。

仮面弁士様のコードでやってみたところ、英数字は難なくできたのですが、日本語の要素を読み込もとうした場合にエラーが起きてしまいます。
投稿者 Yuichi  (中学生) 投稿日時 2011/5/28 22:14:17
>どの記事のどの部分が分からなかったのか、具体的に質問して頂ければ解説することもできますが、
>どこが分からないかも伝えていただけない事には、何を教えれば良いのかも分かりません…。

まだプログラミングに対する知識が未熟なのと、プログラミング関連の語彙が不足していることもあってMSDNライブラリに書かれていることがよく理解できないのです。

DataSetからの読み込み(http://msdn.microsoft.com/ja-jp/library/fx29c3yd.aspx)を例にとってみると、序文からよく意味がわかりませんし、書かれているオプションも具体的に何がどうなるのかよくわかりません。
またDOMというシステム、名称の意味もよく分かっていません。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/5/29 03:22:56
再々度の指摘になりますが、下記の点の徹底をお願いします。
 ・質問前に、ご自身の使っている VB のバージョンを明らかにしましょう。
 ・どのような XML を、どのようなコードで読み取った時に、どういう問題が出たのかを書きましょう。

話の前後関係から、(VB6 ではなく)VB.NET 系ということは推理できたのですが、それでも
VB.NET2002/2003 と VB2005 と VB2008/2010 とでは、利用可能な選択の幅が異なってきますので。

この手の質問と回答では、具体的なサンプルコードを交えて話した方が手っ取り早いと
思うのですが、残念ながら質問内容に具体的な事があまり書かれていないので、
こちらとしても、ピンポイントの情報を提供することが難しい状況です。
ご自身の状況をできる限り説明できるよう、質問の仕方を工夫してみてください。


> 日本語の要素を読み込もとうした場合にエラーが起きてしまいます。
要素の名前や要素の中身が日本語であろうとなかろうと、処理手順に差は生じないはずですが、
具体的な情報 (ファイル内容、コード、エラー箇所、エラーの内容等) が一切提供されていないので、
回答側としては、どこが間違っているのか、その箇所を指摘することすらできません…。

なので予想で答えますが、もしかして、元の XML の内容自体が間違っているのでは無いでしょうか。

よほど特殊な XML (ワンセグで使われる BML など)を除いては、XML で扱われる文字コードは、
基本的に Unicode 系のエンコーディングを前提としています。Unicode 以外も選択できますが、
XML で利用可能な文字コードは限られていますし、Unicode 以外(Shift_JIS など)を採用する場合は、
xml 宣言にて encoding を指定する必要があります。もちろん、encoding で UTF-8 を指定しておきながら、
実際のエンコーディングが Shift_JIS だったりするのも NG ですが…そういった点は大丈夫でしょうか?

XML 自体に間違いが無いのだとすれば、コード側に問題があるのだと思います。
残念ながらその問題点がどこであるのかは、具体的な情報を提示してもらわないと指摘できませんが。


> DataSetからの読み込み
DataSet および シリアライズ/デシリアライズ という方式については、用途が限定されているので、
とりあえず現段階では忘れてしまってもかまいません。

一応ざっくり説明しておくと、それらは元々 XML 用ではなく、
 ・DataSet … 主にデータベース操作に使われる物。主に表形式のデータを管理する仕組み。
 ・シリアライズ … 自分で作ったクラスの内容を、ファイル等に保存するための仕組み。
 ・デシリアライズ … シリアライズされたデータを、オブジェクトに復元するための仕組み。
となっています。
たまたま、その保存形式の一つとして XML 形式を選択できるというだけであって、
XML の読み書きを主題とした方法というわけではありません。


XML の操作については、基本的には、DOM(ドキュメント オブジェクト モデル)と呼ばれる、
XML の階層構造をたどる方式を使うのが一般的かと思います。
この方法では、先述した XmlDocument クラスを使うことになります。
これはその名前通り、XML 文書の操作を主目的としたクラスなので、細かい XML 操作が可能です。

そして VB2008 以降では、XDocument というクラスを用いて、より直接的な読み込みが可能です。
VB2008 では、VB 自体に言語レベルで XML のサポートが組み込まれているのですが、
その基礎となるのが XDocument クラスです(先の、<foo> を読み取る短いサンプルがコレです)。

XmlDocument と XDocument とではできる範囲に差があるので、現段階ではどちらを採用すべきかを
提示することは難しいのですが、直観的にあつかるのは XDocument の方でしょうかね。

# XmlDocument や XDocument では、階層が深い場合などに便利な「XPath式」と呼ばれる構文も
# サポートしているのですが、こちらは構文が少々特殊なので、今回は説明を省きます。


> 序文からよく意味がわかりませんし
それは、現時点では仕方のないところだとは思います。

まずは各行の意味をひとつひとつ読み取ろうとするよりは、チュートリアル系のページを見ながら、
サンプルコードを真似る事から始めるのが早道かと思いますよ。サンプルを真似て try & error で
試すだけならば、それほど難しい話では無いでしょうし。

MSDN は基本、仕様書/説明書の類であって、初心者向けの資料ではありませんので、文章の
1行1行をつぶさに読み解こうとすれば、そこにはある程度以上の基礎知識が要求されます
――数学を学ぶ前に算数の知識が必要であるかのように。

一方、ある程度の知識は身につけていて、それでも序文から分からない箇所に当たっている状況なら、
序文のどの部分が分からなかったのかを書いていただければ、何について学ぶべきかを指摘したり、
用語の意味を追加解説するといったお手伝いはできるかと思います。