![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
XmlDocument.ReadNode()メソッドについて質問があります。
現在、VisualStudio2003のVisual C#で、XMLファイルを読み込むアプリケーションを作っています。その際、XmlTextReaderで、あるファイルを読み込み、XmlDocument.ReadNode()で要素を読み込もうとすると、「インデックスが配列の境界外です。」というIndexOutOfExceptionが発生します。
読み込もうとしているファイルは約2GBで、ReadNode()で読み込まれる要素の数は約80,0000個です。
ここで質問なのですが、ReadNode()には、扱えるファイルサイズの上限のようなものがあるのでしょうか、それとも読み込める要素の数に上限があるのでしょうか。
プログラム例:
//"input.xml"は、サイズが約2GBで、Elementの数が約80,0000
XmlTextReader reader = new XmlTextReader("input.xml");
reader->MoveToContent();
XmlDocument xml = new XmlDocument();
//ここ↓のWhileを約80,0000回ループすると75,0000回あたり
//でIndexOutOfRangeExceptionがReadNode()からスローされる
while (reader.MoveToNextAttribute())
{
try
{
XmlNode a = doc.ReadNode(reader);
}
catch(Exception e)
{
//ここで「インデックスが配列の境界外です。」をキャッチ
}
}
No.1ベストアンサー
- 回答日時:
検索したところでは
いくつか2GBの制約があるというのを見つけることが出来た。
MS公式情報ではないのでどれだけ信頼性のある情報かわからない。
すくなくともMSDN Library2にはこの件に関する記述はない
http://msdn2.microsoft.com/en-us/library/system. …
http://www.thescripts.com/forum/thread171942.html
http://www.topxml.com/system_xml/system_xml_xmlt …
>Use this class when iterating through or retrieving data from larger documents, and when validation is not required.【However, note that this class does not support files larger than 2GB.】 Below are three simple examples that incorporate the System.Xml.XmlTextReader class.
本当はMSDNあたりからの情報が欲しいんだけどな。
http://www.thescripts.com/forum/thread572092.html
>A process can only use up to 2GB memoery on a 32 bit operating system. In
this case, you cannot load an xml file larger than 2GB into memory using
XmlDocument. In this case, I suggest you use XmlTextReader.【As far as I know, in .NET framework 1.1, it has a 2GB limit also. However, in 2.0 this limit was fixed and no longer exists.】
によれば.NET 2.0ではこの問題は治っているようだ、との記述もあるようだが・・・質問者様が恐らく納品されるであろう先の制限で出来ないんだろうね・・・
この回答への補足
テストで使ったコードです↓
インデントが無茶苦茶ですみません。
ファイル生成:
class Program
{
static void Main(string[] args)
{
UInt64 num = 0;
string filename = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
string path = System.IO.Path.GetDirectoryName(filename);
StreamWriter sw =
new StreamWriter(path + "\\test.xml", true);
sw.WriteLine("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
sw.WriteLine("<root>");
//while (num < 1000000)
while (num < 1)
{
int loop = 0;
sw.WriteLine("<test>");
while(loop <=10)
{
sw.WriteLine("<test1>99999</test1>");
sw.WriteLine("<test2>1900-01-01-01</test2>");
sw.WriteLine("<test3>99999</test3>");
sw.WriteLine("<test4>99999</test4>");
sw.WriteLine("<test5>99999</test5>");
sw.WriteLine("<test6>99999</test6>");
sw.WriteLine("<test7>99999</test7>");
sw.WriteLine("<test8>99999</test8>");
sw.WriteLine("<test9>99999</test9>");
sw.WriteLine("<test10>99999</test10>");
loop++;
}
sw.WriteLine("</test>");
num++;
}
sw.WriteLine("</root>");
sw.Close();
}
}
ファイル読み込み:
class Program
{
static void Main(string[] args)
{
string filename = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
string path = System.IO.Path.GetDirectoryName(filename);
XmlTextReader reader = new XmlTextReader(path + "\\test.xml");
reader.WhitespaceHandling = WhitespaceHandling.None;
reader.ReadStartElement();
XmlDocument doc = new XmlDocument();
XmlNode node;
while(reader.NodeType == XmlNodeType.Element)
{
try
{
node = doc.ReadNode(reader);
//Console.WriteLine(node.ToString());
}
catch(Exception e)
{
Console.WriteLine(e.Message.ToString());
}
}
}
}
himajin100000様
ご回答ありがとうございます。
的確な回答をいただき、感動いたしました。
ご回答を手掛かりに以下のことを試したところ、やはり.NET Framework 1.1
のXMLDocument.ReadNode()は2GBを超えるファイルを扱うことができなさそう
です。
VisualStudio 2003(.NET Framework 1.1)
・2GB未満のXMLファイルを生成し、ReadNode()で読み込む
→ エラーは発生しない。
・2GBより大きいXMLファイルを生成し、ReadNode()で読み込む
→ IndexOutOfRangeExceptionが発生した。
VisualStudio 2005.NET Framework 2.0)
・2GB未満のXMLファイルを生成し、ReadNode()で読み込む
→ エラーは発生しない。
・2GBより大きいXMLファイルを生成し、ReadNode()で読み込む
→ エラーは発生しない。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- その他(プログラミング・Web制作) Sikulix2.0.5(Jython2.7.3)でcsvを読込WEB検索条件にpasteで文字化け 1 2023/03/31 11:02
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- 電子書籍 電子書籍の開き方教えて 2 2022/04/30 07:04
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DOSコマンドラインからxmlファ...
-
バッチファイルでテキストファ...
-
RDFファイルは何故拡張子が.rdf...
-
eclipseへのxmlファイル追加
-
質問
-
あせんうぶり言語
-
SNMP リンクダウンとノードダ...
-
CPUの考え方を教えてください ...
-
同じタグ名の項目取得
-
XSLTで固定長データファイルを...
-
XML、XSLTの適応エラー(IEから...
-
VBでXMLファイルを作ると xmlns...
-
VB.NETで最後フォのフォ...
-
MSXMLを使ってノードを削除した...
-
isnan・isnf関数が「識別子が見...
-
【C#】TreeViewがクリックされ...
-
Access VBAでXMLが読み込めない
-
スタイルシートを使用したXM...
-
順不同・任意のタグ
-
XMLで要素が記述された順番に意...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチファイルでテキストファ...
-
UTF-8でエンコーディングとはど...
-
DOSコマンドラインからxmlファ...
-
GoogleマップでKMLが読み込めない
-
ExcelVBAで書き出した文字が化ける
-
C#で使用中のファイルに別のフ...
-
XMLファイルの作り方がわかりま...
-
eclipseへのxmlファイル追加
-
XHTMLの拡張子
-
VBAでxmlファイルの置換をしたい
-
複数のXMLファイルからデータを...
-
NEXUS7でSecret No5の使い方
-
ホームページビルダー19で作...
-
Windowsで見かけるxmlファイル...
-
Excel(2007以降)をxml形式に変...
-
質問
-
XMLデータを整形して、ブラウザ...
-
DataSetのwriteXmlでのXML宣言
-
ザウルスSL-860でのKeyHelperAp...
-
サイトマップとは何でしょうか?
おすすめ情報