次の方法で共有


System.Xml.XmlTextReader クラス

この記事は、この API のリファレンス ドキュメントの補足説明です。

Note

新しい機能を利用するには、XmlReader.Create メソッドを使用して XmlReader インスタンスを作成することをお勧めします。

XmlTextReader は、XML データのストリームへの順方向専用の読み取り専用アクセスを提供します。 現在のノードとは、現在リーダーが置かれているノードのことです。 リーダーは任意の読み取りメソッドを使用して前方へ移動され、プロパティは現在のノードの値を反映します。

このクラスは XmlReader を実装し、W3C の勧告である「Extensible Markup Language (XML) 1.0」と「Namespaces in XML」に準拠しています。 XmlTextReader は、次の機能を提供します。

  • 整形式 XML の規則を適用します。

  • XmlTextReader は、データの検証は提供しません。

  • DocumentType ノードが整形式であることを検査します。 XmlTextReader は、DTD が整形式であることを検査しますが、DTD を使用する検証は行いません。

  • NodeTypeXmlNodeType.EntityReference であるノードの場合、1 つの空の EntityReference ノードが返されます (つまり、Value プロパティは String.Empty です)。

Note

DTD 内のエンティティの実際の宣言は Entity ノードと呼ばれます。 データ内でこれらのノードを参照するときは、EntityReference ノードと呼ばれます。

  • 既定の属性を展開しません。

XmlTextReader は、データ検証に必要な追加の検査を実行せずに、高速な整形式パーサーを提供します。

データ検証を実行するには、検証用に XmlReader を使用します。

XmlDocument から XML データを読み取るには、XmlNodeReader を使用します。

XML 解析エラーの場合、XmlTextReaderXmlException をスローします。 例外がスローされると、リーダーの状態は予測できません。 たとえば、報告されたノード型が、現在のノードの実際のノード型と異なる場合があります。 ReadState プロパティを使用して、リーダーがエラー状態であるかどうかを調べてください。

セキュリティに関する考慮事項

XmlTextReader クラスを使用するときに考慮する点を次に示します。

  • 例外がスローされると、アプリケーションに表示したくないパス情報を XmlTextReader が開示する可能性があります。 アプリケーションは例外をキャッチし、それらを適切に処理する必要があります。

  • DTD の処理は既定で有効になっています。 サービス拒否攻撃が懸念される場合や、信頼されていないソースを扱う場合は、DTD 処理を無効にしてください。 DTD の処理を無効にするには、DtdProcessing プロパティを Prohibit に設定します。

    DTD 処理を有効にした場合、XmlSecureResolver を使用して XmlTextReader でアクセス可能なリソースを制限できます。 また、XML 処理に対するメモリと時間の割り当てが制限されるようにアプリケーションをデザインすることもできます。 たとえば、ASP.NET アプリケーション内でタイムアウト制限を設定します。

  • XML データには、DTD ファイルなどの、外部リソースへの参照が含まれる可能性があります。 既定では、外部リソースはユーザー資格情報なしで、XmlUrlResolver オブジェクトを使用して解決されます。 この点については、次のいずれかの方法でセキュリティを強化できます。

    • XmlTextReader プロパティを XmlResolver オブジェクトに設定することによって、XmlSecureResolver がアクセスできるリソースを制限します。

    • XmlReader プロパティを XmlResolver に設定することにより、null が外部リソースを開けないようにする。

  • XML データには、処理に長時間を要する大量の属性、名前空間宣言、入れ子になった要素などが含まれることがあります。 XmlTextReader に送信される入力のサイズを制限するには、カスタム IStream 実装を作成し、それを XmlTextReader に渡します。

  • ReadValueChunk メソッドを使用して、大規模なデータ ストリームを処理できます。 このメソッドは、値全体に 1 つの文字列を割り当てる代わりに、一度に少数の文字を読みます。

  • 既定では、一般エンティティは展開されません。 一般エンティティは ResolveEntity メソッドを呼び出したときに展開されます。