C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: XmlReaderで行番号を指定して読み込む方法


(過去ログ 12 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■3462 / inTopicNo.1)  XmlReaderで行番号を指定して読み込む方法
  
□投稿者/ DD. (6回)-(2007/05/10(Thu) 21:38:59)

分類:[C# (Windows)] 

DD.と申します。

環境はXPのVS2005です。

現在、XmlTextReaderを用いてXMLデータの読み込みを行っています。
特定要素へのアクセス速度を上げるために、最初の読み込み時に行番号を保持するようにしております。

そこで特定要素へのアクセス時に、保持していた行番号を指定して読み込みを行いたいのですが、
オーソドックスな方法はどのようなものになるのかをご教授頂きたいと思い、投稿させて頂きました。

私が実装しようとした方法は、XmlTextReaderに単純に行番号を指定できるようなメソッドなどが見つからなかったため、
(LineNumberプロパティもget()のみなため)XmlReaderSettingsのLineNumberOffsetに行番号をセットし、
XmlReader.Create()で既存XmlTextReaderと、行番号を設定したXmlReaderSettingsを元に新しいXmlReaderを作成して
読み込みを行いました。

が、結果はうまくいかず、XmlReaderSettingsで設定した行番号は反映されていませんでした。
(XmlReader.Create()時に例外は発生していません)

また、さらに教えて頂きたいのですが、例えばXmlTextReader.Create()で作成されたインスタンスは
XmlTextReader型となるのかと思いきや、XmlReader型となっている感じがして、
XmlTextReader型にキャストして保持しても、既存XmlTextReader型の要素をなに一つ引き継いではいませんでした。
(XmlReader.Create()に関して根本的に勘違いをしているのかもしれませんが・・・)
これは正しい動作となるのでしょうか?

引用返信 編集キー/
■3466 / inTopicNo.2)  Re[1]: XmlReaderで行番号を指定して読み込む方法
□投稿者/ Hongliang (135回)-(2007/05/10(Thu) 22:48:57)
Hongliang さんの Web サイト
そもそも、XmlReader は
> XML データに対する非キャッシュ、前方参照専用、読み取り専用のアクセスを提供する
だけですので、お望みのものから些か距離が遠いでしょう。

XML では行というのはなかなか信用しづらい値かと思います。
無理にやるなら、TextReader で必要なだけ読み捨ててから XmlReaderSettings の ConformanceLevel を Fragment にして Create するとかですかね。
ちょっと読み過ぎるとあっという間に例外ですけど。

んー、しかしどうもシーンが思いつきませんね。


> また、さらに教えて頂きたいのですが、例えばXmlTextReader.Create()で作成されたインスタンスは
> XmlTextReader型となるのかと思いきや、XmlReader型となっている感じがして、
> XmlTextReader型にキャストして保持しても、既存XmlTextReader型の要素をなに一つ引き継いではいませんでした。

ヘルプで XmlTextReader のメンバ一覧の Create メソッドを開くとメソッドのオーバーロードの一覧が出ますが、そこのタイトルは
> XmlReader.Create メソッド
です。
単に親クラスである XmlReader の静的メソッドが子のクラスである XmlTextReader の型名からでも引けると言うだけに過ぎず、XmlReader.Create を指すことになります。
// 子クラスの名で親クラスの静的メソッドを探せてしまうのは気持ち悪いなぁ。

そして、ヘルプに書かれているとおり返値はあくまで XmlReader であって XmlTextReader ではありません。
// って言うか既存 XmlTextReader 型の要素を引き継ぐってどういう事?
引用返信 編集キー/
■3467 / inTopicNo.3)  Re[2]: XmlReaderで行番号を指定して読み込む方法
□投稿者/ DD. (8回)-(2007/05/10(Thu) 23:13:58)
No3466 (Hongliang さん) に返信
返信ありがとうございます。

> そもそも、XmlReader は
>>XML データに対する非キャッシュ、前方参照専用、読み取り専用のアクセスを提供する
> だけですので、お望みのものから些か距離が遠いでしょう。
う〜ん。そうなんですね。
Xml系の別クラスを調べるか、自作するかして再検討してみます。

> XML では行というのはなかなか信用しづらい値かと思います。
> 無理にやるなら、TextReader で必要なだけ読み捨ててから XmlReaderSettings の ConformanceLevel を Fragment にして Create するとかですかね。
> ちょっと読み過ぎるとあっという間に例外ですけど。
ご教授ありがとうございます。参考にしてみます。

> ヘルプで XmlTextReader のメンバ一覧の Create メソッドを開くとメソッドのオーバーロードの一覧が出ますが、そこのタイトルは
>>XmlReader.Create メソッド
> です。
これに関して疑問であったのが、Create()はXmlReaderSettingsを指定することができ、
XmlReaderSettingsには行番号を指定するプロパティがあるにものかかわらず、
XmlReaderには行番号を保持するメンバもなく、プロパティも存在しないのか?です。
XmlReaderSettingsを別な要因で扱う場合に有用なのかどうかは詳細を確認していないのですが、
Create()に関して意味をなさないのかな?と思っています。

> // って言うか既存 XmlTextReader 型の要素を引き継ぐってどういう事?
これに関してはMSDNの私の勝手な解釈または、想像・・・かもです。
Create()では基となるXmlReaderを指定することができますので、
適切な形(ReadStateなどは引き継いだ時点でファイル終端になってしまうので)でそれの状態を引き継いでかつ、
XmlReaderSettingsを噛み合わせたXmlReaderをCreateしてくれるのかな?と思ってます。。。

引用返信 編集キー/
■3470 / inTopicNo.4)  Re[3]: XmlReaderで行番号を指定して読み込む方法
□投稿者/ Hongliang (136回)-(2007/05/11(Fri) 00:42:01)
Hongliang さんの Web サイト
> これに関して疑問であったのが、Create()はXmlReaderSettingsを指定することができ、
> XmlReaderSettingsには行番号を指定するプロパティがあるにものかかわらず、
> XmlReaderには行番号を保持するメンバもなく、プロパティも存在しないのか?です。
> XmlReaderSettingsを別な要因で扱う場合に有用なのかどうかは詳細を確認していないのですが、
> Create()に関して意味をなさないのかな?と思っています。

XmlReaderSettings.LineNumberOffset の意味を誤解なさっているようです。
ドキュメントの記述もちょっと分かりにくいですけど。
例えば、以下のようなコードで例外メッセージを確認してみて下さい。
// contents 要素が閉じてないので必ず例外が発生します。

string xml = @"<?xml version=""1.0""?>
<root>
  <body>
    <contents>
  </body>
</root>";
TextReader text = new StringReader(xml);
XmlReaderSettings set = new XmlReaderSettings();
set.LineNumberOffset = 100; // コメントアウトしたり
XmlReader reader = XmlReader.Create(text, set);
try {
    while (reader.Read());
}
catch (XmlException ex) {
    Debug.WriteLine(ex);
}


> Create()では基となるXmlReaderを指定することができますので、
> 適切な形(ReadStateなどは引き継いだ時点でファイル終端になってしまうので)で
> それの状態を引き継いでかつ、
> XmlReaderSettingsを噛み合わせたXmlReaderをCreateしてくれるのかな?と思ってます。。。

前述の通り、XmlReader は非キャッシュ、前方参照専用ですから、
途中まで読み進めた XmlReader を元に Create してもその途中からしか読めませんよ?
最後まで読んだ XmlReader を元にしたなら初回の Read 呼び出しでもう false です。
Validation を追加する時に使うぐらいかしらん?

引用返信 編集キー/
■3477 / inTopicNo.5)  Re[4]: XmlReaderで行番号を指定して読み込む方法
□投稿者/ DD. (10回)-(2007/05/11(Fri) 09:34:33)
No3470 (Hongliang さん) に返信
返信ありがとうございます。

> XmlReaderSettings.LineNumberOffset の意味を誤解なさっているようです。
ご指摘ありがとうございます。
大変な間違いをしていたようですね。。。
MSDNをきちんと読み直しました。
<引用>
LineNumberOffset の設定に応じて、LineNumber プロパティが番号付けを開始する位置が決まります。
</引用>
ぜんぜん違ってましたね^^;

> 前述の通り、XmlReader は非キャッシュ、前方参照専用ですから、
> 途中まで読み進めた XmlReader を元に Create してもその途中からしか読めませんよ?
そこらへんはうまく調整してくれてるのかなぁと勝手に期待してました・・・
別なアプローチを検討してみます。

Hongliangさんありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -