System.Xml.XmlTextWriter クラス

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

XmlTextWriter クラスは、XmlWriter クラスを実装します。

Note

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

XmlTextWriter は、現在の要素のスタックで定義されたすべての名前空間に対応する名前空間スタックを保持します。 XmlTextWriter を使用すると、名前空間を手動で宣言できます。

w.WriteStartElement("root");
w.WriteAttributeString("xmlns", "x", null, "urn:1");
w.WriteStartElement("item","urn:1");
w.WriteEndElement();
w.WriteStartElement("item","urn:1");
w.WriteEndElement();
w.WriteEndElement();

上記の C# コードでは、次の出力が生成されます。 XmlTextWriter は、名前空間宣言をルート要素に昇格し、2 つの子要素で重複しないようにします。 子要素は、名前空間宣言からプレフィックスを取得します。

<root xmlns:x="urn:1">
<x:item/>
<x:item/>
</x:root>

XmlTextWriter を使用すると、現在の名前空間宣言をオーバーライドすることもできます。 次の例では、名前空間 URI "123" が "abc" によってオーバーライドされ、XML 要素 <x:node xmlns:x="abc"/> が生成されます。

w.WriteStartElement("x","node","123");
w.WriteAttributeString("xmlns","x",null,"abc");

プレフィックスを引数として受け取る書き込みメソッドを使用すると、使用するプレフィックスを指定することもできます。 次の例では、2 つの異なるプレフィックスが同じ名前空間 URI にマップされ、XML テキスト <x:root xmlns:x="urn:1"><y:item xmlns:y="urn:1"/></x:root> が生成されます。

XmlTextWriter w = new XmlTextWriter(Console.Out);
w.WriteStartElement("x","root","urn:1");
w.WriteStartElement("y","item","urn:1");
w.WriteEndElement();
w.WriteEndElement();
w.Close();

異なるプレフィックスを同じ名前空間 URI にマップする複数の名前空間宣言がある場合、XmlTextWriter は、名前空間宣言のスタックを逆方向に走査して最も近いものを選択します。

XmlTextWriter w = new XmlTextWriter(Console.Out);
w.Formatting = Formatting.Indented;
w.WriteStartElement("x","root","urn:1");
w.WriteStartElement("y","item","urn:1");
w.WriteAttributeString("attr","urn:1","123");
w.WriteEndElement();
w.WriteEndElement();
w.Close();

上記の C# 例であるため、WriteAttributeString呼び出しは、プレフィックスを指定しない場合、ライターの名前空間スタックにプッシュされた最後のプレフィックスを使用して、次の XML が生成されます。

<x:root xmlns:x="urn:1">
<y:item y:attr="123" xmlns:y="urn:1" />
</x:root>

名前空間の競合が発生した場合、XmlTextWriter は、代替プレフィックスを生成して解決します。 たとえば、属性と要素のプレフィックスが同じで、名前空間が異なる場合、XmlWriter は属性の代替プレフィックスを生成します。 生成されたプレフィックスには、n{i} という名前が付けられます。ここで、i は 1 から始まる数値です。 この数値は、要素ごとに 1 にリセットされます。

名前空間 URI に関連付けられる属性には、プレフィックスが必要です (既定の名前空間は属性に適用されません)。 これは、W3C の Namespaces in XML 勧告のセクション 5.2 に準拠します。 属性が名前空間 URI を参照するが、プリフィックスを指定しない場合、ライターが属性のプリフィックスを生成します。

空の要素を書き込むと、タグ名と終了タグの間にスペースが追加されます (例: <item />)。 これにより、以前のバージョンのブラウザーとの互換性が提供されます。

String をメソッド パラメーターとして使用すると、nullString.Empty は等しくなります。 String.Empty は W3C の規則に従います。

厳密に型指定されたデータを書き込むには、XmlConvert クラスを使用してデータ型を文字列に変換します。 たとえば、次の C# コードはからデータを変換します。DoubleString要素を書き込み、<price>19.95</price>します。

Double price = 19.95;
writer.WriteElementString("price", XmlConvert.ToString(price));

XmlTextWriter は、次のチェックを行いません。

  • 属性名と要素名の無効な文字。
  • 指定したエンコードに適合しない Unicode 文字。 Unicode 文字が、指定したエンコードに適合しない場合、XmlTextWriter は、その Unicode 文字を文字エンティティにエスケープしません。
  • 重複する属性。
  • DOCTYPE のパブリック識別子またはシステム識別子の文字。

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

次の項目は、XmlTextWriter クラスを使用する際の考慮事項です。

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

  • XmlTextWriter を別のアプリケーションに渡すと、下位のストリームがそのアプリケーションに公開されます。 XmlTextWriter を信頼度の低いアプリケーションに渡す必要がある場合は、代わりに XmlWriter メソッドによって作成される Create オブジェクトを使用する必要があります。

  • XmlTextWriter は、WriteDocType または WriteRaw メソッドに渡されるデータの検証を行いません。 これらのメソッドに任意のデータを渡さないでください。

  • 既定の設定が変更された場合、生成される出力が整形式の XML データであるという保証はありません。

  • 信頼されていないソースからのサポート コンポーネント (Encoding オブジェクトなど) は受け入れないようにします。