XmlReader による XML の読み取り
XmlReader クラスは、非キャッシュ、前方参照専用、読み取り専用のアクセスを提供する抽象基本クラスです。XmlReader クラスは、XML が整形式であることをチェックし、エラーを検出すると XmlExceptions をスローします。XmlReader クラスは、ストリームまたはドキュメントを読み取ることができ、www.w3.org/TR/REC-xml-names にある W3C の勧告に概説されている名前空間要件を実装します。
XmlReader は抽象クラスであるため、独自のタイプのリーダーをカスタマイズしたり、XmlTextReader、XmlValidatingReader、および XmlNodeReader クラスの現在の実装を拡張できます。ただし、.NET Framework Version 1.1 で XmlReader に実装されているセキュリティ制約により、XmlTextReader と XmlValidatingReader を継承する機能は制限されます。.NET Framework Version 1.0 では、どのコンポーネントも XmlTextReader または XmlValidatingReader を継承できます。.NET Framework Version 1.1 では、XmlTextReader と XmlValidatingReader のコンストラクタに継承確認要求が実装されたため、XmlTextReader または XmlValidatingReader を継承できるコンポーネントは、信頼されているコンポーネントだけになりました。
また、XmlReader は、XML からのデータの取得や不要なレコードのスキップを可能にするメソッドを定義します。XmlReader は、プッシュ モデルの SAX とは異なります。SAX には、アプリケーションにイベントをプッシュするパーサーが搭載されています。SAX との比較の詳細については、「XmlReader と SAX リーダーの比較」を参照してください。
XmlReader クラスには、次の処理を実行するメソッドがあります。
- XML テキスト ファイルなど、コンテンツ全体が含まれている XML からのコンテンツの読み込み
- XML 要素スタックの深さの検出
- 要素にコンテンツが含まれているかどうかの判定
- 属性の読み取りと移動
- 要素とそのコンテンツのスキップ
XmlReader クラスには、次の情報を返すプロパティがあります。
- 現在のノードの名前と種類
- 現在のノードのコンテンツ
基本クラスを拡張する XmlReader クラスの実装は、サポートするシナリオのニーズによってデザインが異なります。XmlReader クラスの実装の説明を次の表に示します。
クラス | 説明 |
---|---|
XmlTextReader クラス | 文字ストリームを読み取ります。これは前方参照専用のリーダーであり、コンテンツとノード タイプのデータを返すメソッドが用意されています。ドキュメント型定義 (DTD) またはスキーマのサポートはありません。 |
XmlNodeReader クラス | XmlNode ツリーのような XML ドキュメント オブジェクト モデル (DOM) API に対してパーサーを提供します。XmlNode を受け取り、DOM ツリーで検出されたすべてのノードを、エンティティ参照ノードも含めて返します。DTD またはスキーマ検証のサポートはありませんが、DTD で定義されたエンティティを解決できます。 |
XmlValidatingReader クラス | DTD、XML スキーマ定義言語 (XSD) スキーマ、または XML-Data Reduced (XDR) スキーマをサポートする、標準に完全に準拠した検証または非検証 XML パーサーを提供します。XmlTextReader を受け取り、その上位に検証サービス層を作成します。 |
カスタマイズされた XML リーダーの作成 | 開発者が XmlReader の派生クラスを定義できます。 |
メモ XmlTextReader と XmlValidatingReader には、読み込むファイルのサイズに制限があります。2 ギガバイトを超えるファイルは読み込むことができません。その場合は、可能であれば、ソース ファイルを複数の小さなファイルに分割します。
別の実装として、パブリック コンストラクタを持たない XsltReader があります。XsltReader は、XslTransform クラスの Transform メソッドを呼び出した結果として作成されます。XsltReader には次の機能があります。
- XML は整形式でなければならないという規則を適用します。
- DTD またはスキーマによる検証は行いません。
- XPath データ モデルでは DTD 情報 (DOCTYPE ノード) が公開されないため、既定の属性は展開されません。XmlReader.IsDefault プロパティを参照してください。変換の適用前にソース ドキュメントの既定の属性を展開する必要がある場合は、XmlValidatingReader をとおしてデータ ストア (たとえば XmlDocument) を読み込む必要があります。
XmlTextReader、XmlValidatingReader、XmlNodeReader の各クラスは、それぞれ異なるシナリオをサポートするようにデザインされています。各シナリオに適したリーダーと、ValidationType プロパティに設定する値を次の表に示します。
シナリオ | 使用するリーダー | ValidationType プロパティ |
---|---|---|
高いパフォーマンスを必要とし、DTD やスキーマのサポートを必要としない場合。 | XmlTextReader | 使用できません。 |
DTD で提供される外部エンティティと DocType も含め、XML が整形式になっている必要がある場合。 | XmlTextReader | 使用できません。 |
DTD に従って、XML が有効で整形式になっている必要がある場合。 | XmlValidatingReader | Auto または DTD。 |
XML が整形式になっている必要があり、スキーマに対する検証が必要な場合。 | XmlValidatingReader | DTD がない場合、または XDR スキーマの場合は Auto。 |
XmlNode から XML データをストリーム転送するとき、XML が整形式になっている必要がある場合。 | XmlNodeReader | 使用できません。 |
それぞれのシナリオを実現するために、各種リーダーの XmlResolver プロパティと XmlTextReader.Normalization プロパティを設定する方法を次の表に示します。
Normalization プロパティが true に設定されている場合は、テキスト内の行末文字と空白ノードが正規化され、属性値も型に応じて正規化されます。その結果、Normalization プロパティを true に設定すると、既定値の false のときよりもパフォーマンスが低下します。詳細については、「Normalization プロパティ」を参照してください。
外部 DTD など、URI で指定された外部リソースを解決したり、スキーマを検索するには、XmlResolver プロパティを使用します。別のリーダーで XmlResolver プロパティを使う方法の詳細については、「XmlResolver を使用したリソースの解決」を参照してください。
シナリオ | XmlResolver | Normalization プロパティ |
---|---|---|
高いパフォーマンスを必要とし、DTD やスキーマのサポートを必要としない場合。 | null 参照に設定します。詳細については、「XmlResolver プロパティ」を参照してください。 | false に設定します。 |
DTD で提供される外部エンティティと DocType も含め、ドキュメントが整形式になっている必要がある場合。 | 非 null 参照に設定します。すべての外部エンティティは解決可能である必要があります。詳細については、「XmlResolver プロパティ」を参照してください。 | true に設定します。 |
ドキュメントが整形になっている必要があり、DTD に従って XML が有効でなければならない場合。 | 非 null 参照に設定します。すべての外部エンティティは解決可能である必要があります。詳細については、「XmlResolver プロパティ」を参照してください。 | XmlValidatingReader に渡す前に、XmlTextReader で true に設定します。 |
ドキュメントが整形式になっている必要があり、スキーマ検証が必要な場合。 | 非 null 参照に設定します。すべての外部エンティティは解決可能である必要があります。詳細については、「XmlResolver プロパティ」を参照してください。 | XmlValidatingReader に渡す前に、XmlTextReader で true に設定します。 |
XmlNode から XML データをストリーム転送するとき、XML が整形式になっている必要がある場合。 | 使用できません。 | 使用できません。 |
XmlValidatingReader は、XmlTextReader に対して検証サービスを提供します。詳細については、「XmlValidatingReader を使用した XML の検証」を参照してください。
参照
XmlReader における現在のノードの位置 | XmlReader のプロパティ設定 | XmlReader と XmlNameTable によるオブジェクトの比較 | XmlReader による属性の読み取り | 要素および属性のコンテンツの読み取り | XmlReader によるコンテンツのスキップ | EntityReference の読み取りと展開 | XmlReader と SAX リーダーの比較 | XmlTextReader による XML データの読み取り | XmlNodeReader によるノード ツリーの読み取り | XmlValidatingReader による XML の検証 | カスタマイズされた XML リーダーの作成 | XmlReader クラス | XmlReader メンバ | XmlNodeReader クラス | XmlNodeReader メンバ | XmlTextReader クラス | XmlTextReader メンバ | XmlValidatingReader クラス | XmlValidatingReader メンバ