??XmlReadWriter クラスを設計します
??前述したように、XML リーダーとライターは独立して動作します。リーダーは読み取りのみ、ライターは書き込みのみを行います。アプリケーションが長い XML ドキュメントを処理する必要があり、そのドキュメントに不安定なデータが含まれているとします。 Reader は、ドキュメントの内容を読むための優れた方法を提供します。一方、Writer は XML ドキュメントのフラグメントを作成するのに非常に便利なツールですが、読み取りと書き込みの両方を可能にしたい場合は、XMLDOM を使用する必要があります。実際の XML ドキュメントが非常に大きい場合は、別のタイトルが表示されます。この XML ドキュメントをすべてメモリにロードし、後で読み書きする必要がありますか?まず、大規模な XML DOM を解析するためのハイブリッド ストリーム アナライザーを構築する方法を見てみましょう。
??通常の読み取り専用操作と同様に、通常の XML リーダーを使用してノードに順次アクセスします。違いは、XML ライターを使用して、読み取り中に属性値とノードの内容を変更できることです。リーダーを使用してソース ファイル内の各ノードを読み取り、バックグラウンド ライターがノードのコピーを作成します。このコピーでは、いくつかの新しいノードを追加したり、他のノードを無視または編集したり、属性値を編集したりできます。変更が完了したら、古いドキュメントを新しいドキュメントに置き換えます。
??簡単で効果的な方法は、ノード オブジェクトを読み取り専用ストリームから書き込みストリームにコピーすることです。このメソッドでは、XmlTextWriter クラスの WriteAttributes メソッドと WriteNode メソッドの 2 つのメソッドを使用できます。 WriteAttributes メソッドは、現在のリーダーで選択されているノードのすべての有効な属性を読み取り、その属性を別の文字列として現在の出力ストリームにコピーします。同様に、WriteNode メソッドは同様のメソッドを使用して、属性ノードを除く他のタイプのノードを処理します。図 10 に示すコード スニペットは、上記の 2 つのメソッドを使用してソース XML ドキュメントのコピーを作成し、特定のノードを選択的に変更する方法を示しています。 XML ツリーはツリーのルートからアクセスされますが、属性ノード タイプ以外のタイプのノードのみが出力されます。 Reader と Writer を新しいクラスに統合し、ストリームの読み取りと書き込み、プロパティとノードへのアクセスができるように新しいインターフェイスを設計できます。
図 10 WriteNode メソッドの使用
XmlTextReader = new XmlTextReader(inputFile);
XmlTextWriter Writer = new XmlTextWriter(outputFile); //リーダーとライターを構成する
writer.Formatting = Formatting.Indent編;
reader.MoveToContent();
// ルートノードを書き込みます
writer.WriteStartElement(reader.LocalName); // 他のすべてのノードを読み取り、出力します
int i=0; (reader.Read())
{
if (i % 2)
writer.WriteNode(reader, false)
}
// ルートを閉じる
writer.WriteEndElement ();
// リーダーとライターを閉じる
writer.Close();
?? XmlTextReadWriter クラスが XmlReader クラスまたは XmlWriter クラスから永続化されていません。代わりに、他に 2 つのクラスがあり、1 つは読み取り専用ストリーム (ストリーム) に基づくコントロール クラス、もう 1 つは書き込み専用ストリームに基づくコントロール クラスです。 XmlTextReadWriter クラスのメソッドは、Reader オブジェクトを使用してデータを読み取り、Writer オブジェクトに書き込みます。さまざまなニーズに適応するために、内部の Reader オブジェクトと Writer オブジェクトは、読み取り専用の Reader プロパティと Writer プロパティを通じて公開されます。図 11 は、このクラスのいくつかのメソッドを示しています。
図 11 XmlTextReadWriter クラスのメソッド
メソッド
説明
AddAttributeChange
WriteAttributes の連続呼び出し中に処理されるノード属性の変更を実行するために必要なすべての情報をキャッシュします。
内部リーダーの Read メソッドの単純なラッパー。
WriteAttributes
ライターの WriteAttributes メソッドの特殊バージョン。AddAttributeChange メソッドを通じてキャッシュされたすべての変更を考慮して、指定されたノードのすべての属性を書き込みます。
WriteStartDocument
内部ライターがドキュメントを出力し、デフォルトのコメント テキストと標準 XML プロローグを追加するように準備します。
??この新しいクラスには Read メソッドがあります。これは、Reader の読み取りメソッドを単純にカプセル化したものです。さらに、WriterStartDocument メソッドと WriteEndDocument メソッドも提供します。これらは、内部の Reader オブジェクトと Writer オブジェクトをそれぞれ初期化/解放 (ファイナライズ) し、すべての I/O 操作も処理します。ループ内のノードを読み取りながら、ノードを直接修正できます。パフォーマンス上の理由から、最初に AddAttributeChange メソッドを使用して属性を変更する必要があります。ノードの属性に対するすべての変更は一時テーブルに保存され、最後に WriteAttribute メソッドを呼び出すことによって変更が送信され、一時テーブルがクリアされます。
上記は、.NET Framework で XML データを簡単に処理する (5-1) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。