次の方法で共有


System.Xml.XmlWriter クラス

XmlWriter クラスは、XML データをストリーム、ファイル、テキスト リーダー、または文字列に書き込みます。 W3C Extensible Markup Language (XML) 1.0 (第 4 エディション)名前空間 in XML 1.0 (第 3 エディション) の推奨事項がサポートされています。

XmlWriter クラスのメンバーを使用すると、次の機能を使用できます。

  • 文字が有効な XML 文字であり、要素名と属性名が有効な XML 名であることを確認します。
  • XML ドキュメントが整形式であることを確認します。
  • バイナリ バイトを Base64 または BinHex としてエンコードし、結果のテキストを書き出します。
  • 値の変換を手動で実行する必要がないように、文字列の代わりに共通言語ランタイム型を使用して値を渡します。
  • 複数のドキュメントを 1 つの出力ストリームに書き込みます。
  • 有効な名前、修飾名、および名前トークンを書き込みます。

XML ライターを作成する

XmlWriter インスタンスを作成するには、XmlWriter.Create メソッドを使用します。 XML ライターで有効にする機能のセットを指定するには、Create メソッドにXmlWriterSettingsを渡します。 それ以外の場合は、既定の設定が使用されます。 詳細については、 Create リファレンス ページを参照してください。

出力形式を指定する

XmlWriterSettings クラスには、出力の書式設定方法XmlWriter制御するいくつかのプロパティが含まれています。

プロパティ 説明
Encoding 使用するテキスト エンコードを指定します。 既定値は Encoding.UTF8です。
Indent 要素をインデントするかどうかを示します。 既定値は false (インデントなし) です。
IndentChars インデント時に使用する文字列を指定します。 既定値は 2 つのスペースです。
NewLineChars 改行に使用する文字列を指定します。 既定では、Unix 以外のプラットフォームの場合は \r\n (復帰、ライン フィード)、Unix プラットフォームの場合は \n (ライン フィード) です。
NewLineHandling 改行文字の処理方法を指定します。
NewLineOnAttributes 新しい行に属性を書き込むかどうかを示します。 Indent このプロパティを使用する場合は、 true に設定する必要があります。 既定値は falseです。
OmitXmlDeclaration XML 宣言を記述するかどうかを示します。 既定値は falseです。

IndentプロパティとIndentChars プロパティは、重要でない空白の書式設定方法を制御します。 たとえば、要素ノードをインデントするには、次のようにします。

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = "\t";
XmlWriter writer = XmlWriter.Create("books.xml", settings);
Dim settings As New XmlWriterSettings()
settings.Indent = True
settings.IndentChars = vbTab
Dim writer As XmlWriter = XmlWriter.Create("books.xml", settings)

NewLineOnAttributesを使用して、1 つの追加レベルのインデントで新しい行に各属性を書き込みます。

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.NewLineOnAttributes = true;
XmlWriter writer = XmlWriter.Create("books.xml", settings);
Dim settings As New XmlWriterSettings()
settings.Indent = True
settings.NewLineOnAttributes = True
Dim writer As XmlWriter = XmlWriter.Create("books.xml", settings)

データの準拠

XML ライターは、 XmlWriterSettings クラスの 2 つのプロパティを使用して、データの準拠を確認します。

  • CheckCharacters プロパティは、W3C で定義されているように、文字をチェックし、有効範囲外の文字がある場合はXmlException例外をスローするように XML ライターに指示します。

  • ConformanceLevel プロパティは、書き込まれるストリームが、W3C で定義されている整形式の XML 1.0 ドキュメントまたはドキュメント フラグメントの規則に準拠していることを確認するように XML ライターを構成します。 次の表では、3 つの準拠レベルについて説明します。 既定値は Documentです。 詳細については、 XmlWriterSettings.ConformanceLevel プロパティと System.Xml.ConformanceLevel 列挙体を参照してください。

    レベル 説明
    Document XML 出力は、整形式の XML 1.0 ドキュメントの規則に準拠しており、準拠している任意のプロセッサで処理できます。
    Fragment XML 出力は、整形式の XML 1.0 ドキュメント フラグメントの規則に準拠しています。
    Auto XML ライターは、受信データに基づいて、適用する準拠チェックのレベル (ドキュメントまたはフラグメント) を決定します。

要素の書き込み

次の XmlWriter メソッドを使用して、要素ノードを書き込むことができます。 例については、一覧のメソッドを参照してください。

用途 移行先
WriteElementString 文字列値を含む要素ノード全体を書き込みます。
WriteStartElement 複数のメソッド呼び出しを使用して要素値を書き込む。 たとえば、 WriteValue を呼び出して型指定された値を書き込んだり、文字エンティティを書き込む WriteCharEntity したり、属性を書き込む WriteAttributeString したり、子要素を記述することができます。 これは、 WriteElementString メソッドのより高度なバージョンです。

要素を閉じるには、 WriteEndElement メソッドまたは WriteFullEndElement メソッドを呼び出します。
WriteNode XmlReaderまたはオブジェクトの現在位置にある要素ノードXPathNavigatorコピーします。 呼び出されると、ソース オブジェクトから XmlWriter インスタンスにすべてをコピーします。

属性の書き込み

次の XmlWriter メソッドを使用して、要素ノードに属性を書き込むことができます。 これらのメソッドは、次のセクションで説明するように、要素に名前空間宣言を作成するためにも使用できます。

用途 移行先
WriteAttributeString 文字列値を含む属性ノード全体を書き込む。
WriteStartAttribute 複数のメソッド呼び出しを使用して属性値を書き込む。 たとえば、 WriteValue を呼び出して、型指定された値を書き込むことができます。 これは、 WriteElementString メソッドのより高度なバージョンです。

要素を閉じるには、 WriteEndAttribute メソッドを呼び出します。
WriteAttributes XmlReader オブジェクトの現在位置にあるすべての属性をコピーします。 書き込まれる属性は、リーダーが現在配置されているノードの種類によって異なります。

- 属性ノードの場合、現在の属性を書き込み、その後、要素がタグを閉じるまで残りの属性を書き込みます。
- 要素ノードの場合、要素に含まれるすべての属性が書き込まれます。
- XML 宣言ノードの場合、宣言内のすべての属性が書き込まれます。
- 他のすべてのノードの種類の場合、メソッドは例外をスローします。

名前空間の処理

名前空間は、XML ドキュメント内の要素名と属性名を修飾するために使用されます。 名前空間プレフィックスは、要素と属性を名前空間に関連付け、URI 参照に関連付けられます。 名前空間は、XML ドキュメント内に要素と属性名の一意性を作成します。

XmlWriterは、現在の名前空間スコープで定義されているすべての名前空間に対応する名前空間スタックを保持します。 要素と属性を記述するときは、次の方法で名前空間を利用できます。

  • WriteAttributeString メソッドを使用して、名前空間を手動で宣言します。 これは、名前空間宣言の数を最適に最適化する方法がわかっている場合に役立ちます。 例については、 WriteAttributeString(String, String, String, String) メソッドを参照してください。

  • 現在の名前空間宣言を新しい名前空間でオーバーライドします。 次のコードでは、 WriteAttributeString メソッドは、 "x" プレフィックスの名前空間 URI を "123" から "abc" に変更します。

    writer.WriteStartElement("x", "root", "123");
    writer.WriteStartElement("item");
    writer.WriteAttributeString("xmlns", "x", null, "abc");
    writer.WriteEndElement();
    writer.WriteEndElement();
    
    writer.WriteStartElement("x", "root", "123")
    writer.WriteStartElement("item")
    writer.WriteAttributeString("xmlns", "x", Nothing, "abc")
    writer.WriteEndElement()
    writer.WriteEndElement()
    

    このコードでは、次の XML 文字列が生成されます。

    <x:root xmlns:x="123">
      <item xmlns:x="abc" />
    </x:root>
    
  • 属性または要素を書き込むときに名前空間プレフィックスを指定します。 要素と属性の書き込みに使用されるメソッドの多くを使用すると、これを行うことができます。 たとえば、 WriteStartElement(String, String, String) メソッドは開始タグを書き込み、指定した名前空間とプレフィックスに関連付けます。

型指定されたデータを書き込む

WriteValue メソッドは、共通言語ランタイム (CLR) オブジェクトを受け入れ、入力値を XML スキーマ定義言語 (XSD) データ型変換規則に従って文字列形式に変換し、WriteString メソッドを使用して書き出します。 これは、 XmlConvert クラスのメソッドを使用して、型指定されたデータを書き出す前に文字列値に変換するよりも簡単です。

テキストに書き込む場合、型指定された値は、そのスキーマ型の XmlConvert 規則を使用してテキストにシリアル化されます。

CLR 型に対応する既定の XSD データ型については、 WriteValue メソッドを参照してください。

XmlWriterを使用して XML データ ストアに書き込むこともできます。 たとえば、 XPathNavigator クラスでは、 XmlWriter オブジェクトを作成して、 XmlDocument オブジェクトのノードを作成できます。 データ ストアに使用可能なスキーマ情報がある場合、許可されていない型に変換しようとすると、 WriteValue メソッドによって例外がスローされます。 データ ストアに使用可能なスキーマ情報がない場合、 WriteValue メソッドはすべての値を xsd:anySimpleType 型として扱います。

XML ライターを閉じる

XmlWriterメソッドを使用して XML を出力する場合、Close メソッドを呼び出すまで要素と属性は書き込まれません。 たとえば、 XmlWriter を使用して XmlDocument オブジェクトを設定する場合、 XmlWriter インスタンスを閉じるまで、ターゲット ドキュメントに書き込まれた要素と属性を表示することはできません。

非同期プログラミング

ほとんどの XmlWriter メソッドには、メソッド名の末尾に "Async" を持つ非同期メソッドがあります。 たとえば、非同期の同等の WriteAttributeStringWriteAttributeStringAsync

非同期に対応する WriteValue メソッドの場合は、戻り値を文字列に変換し、代わりに WriteStringAsync メソッドを使用します。

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

XmlWriter クラスを使用する場合は、次の点を考慮してください。

  • XmlWriterによってスローされた例外は、アプリにバブルアップしたくないパス情報を開示できます。 アプリで例外をキャッチし、適切に処理する必要があります。

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