この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。
注
新しい機能を利用するには、XmlReader メソッドを使用してXmlReader.Create インスタンスを作成することをお勧めします。
XmlTextReader は、XML データのストリームへの前方専用の読み取り専用アクセスを提供します。 現在のノードは、リーダーが配置されているノードを参照します。 リーダーは、読み取りメソッドのいずれかを使用して進められ、プロパティは現在のノードの値を反映します。
このクラスは、 XmlReader を実装し、W3C 拡張マークアップ言語 (XML) 1.0 と XML の名前空間に準拠しています。 XmlTextReader
には、次の機能が用意されています。
整形式 XML のルールを適用します。
XmlTextReader
では、データの検証は提供されません。DocumentType
ノードが整形式であることを確認します。XmlTextReader
は DTD の整形式性をチェックしますが、DTD を使用した検証は行いません。NodeTypeが
XmlNodeType.EntityReference
されているノードの場合は、1 つの空のEntityReference
ノードが返されます (つまり、Value プロパティはString.Empty
)。
注
DTD 内のエンティティの実際の宣言は、 Entity
ノードと呼ばれます。 データ内のこれらのノードを参照すると、ノード EntityReference
呼び出されます。
- 既定の属性は展開しません。
XmlTextReader
はデータ検証に必要な追加のチェックを実行しないため、高速な整形式パーサーを提供します。
データ検証を実行するには、検証 XmlReaderを使用します。
XmlDocumentから XML データを読み取る場合は、XmlNodeReaderを使用します。
XmlTextReader
は、XML 解析時のエラーの際に XmlException を投げます。 例外がスローされると、リーダーオブジェクトの状態は予測できません。 たとえば、報告されるノードタイプは、現在のノードの実際のノードタイプと異なる場合があります。 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 メソッドを呼び出すと、一般的なエンティティが展開されます。
.NET