次の方法で共有


XmlTextWriter による整形式の XML の作成

XmlWriter から派生した XmlTextWriter は、ファイル、コンソール、ストリーム、その他の出力の種類に XML を書き込みます。XML を書くときに、さまざまなメソッドが付加的な処理を行うことで整形式の XML が作成されます。次の表に、適切なデータ形式を確保する処理を実行するメソッドの一覧を示します。

メソッド

機能の説明

WriteAttributeString

XmlTextWriter は、読み取ったコンテンツに応じて属性のテキスト コンテンツをエスケープします。

WriteString

XmlTextWriter は特殊文字をエスケープし、それらの特殊文字を必要に応じて & < > と数値文字エンティティに置き換えます。

WriteBase64

XmlTextWriter は base64 バイトをエンコードし、それを XmlReader で ReadBinary を使用して読み取ることができます。

整形式の XML となるように XmlTextWriter によって行われる追加の作業を次に示します。

  • XML 要素が正しい順序で書き出されるようにします。たとえば、要素の外側に属性を書き込んだり、属性の内側に CDATA ブロックを書き込んだり、複数のルート要素を書き込んだりできないようにします。さらに、<?xml 宣言が先頭になり、<!DOCTYPE ノードがルート要素より前に来るように取り計らいます。

  • xml:space 属性の値と形式を正しく設定し、この属性の値が W3C (World Wide Web Consortium) 勧告『Extensible Markup Language (XML) 1.0 (Fourth Edition)』に準拠していることを確認します。WriteAttributeString メソッド内で xml:space の有効な値を使用している例を次に示します。

    w.WriteAttributeString("xml:space", "", "preserve");
    

    xml:space 属性の有効な値は、defaultpreserve です。引数がこの 2 つの値以外の場合は、ArgumentException がスローされます。

  • Null==String.Empty や String.Empty) のように、文字列がパラメーターとして使用されている場合は、その文字列が W3C 規則に従っているかどうかをチェックします。

次の表は、XmlTextWriter で定義されている追加のメソッドとプロパティで、XmlWriter で継承または定義されていないもの、または Object から継承されていないものを示しています。

メソッドまたはプロパティ

説明

XmlTextWriter

ファイル名、ストリーム、または TextWriter を受け取る XmlTextWriter のインスタンスを作成します。エンコーディング タイプを定義する追加パラメーターを受け取るためのオーバーロードされたメソッドがあります。

Namespaces プロパティ

名前空間がサポートされるかどうかを指定します。false に設定すると、xmlns 宣言が書き込まれないため、任意の数のコロンを含む要素名を指定できます。

Formatting プロパティ

出力形式の指定にインデントを使用するかどうかを定義します。

IndentChar プロパティ

Formatting でインデントする場合に、インデントに使用する文字を定義します。

Indentation プロパティ

Formatting でインデントする場合に、階層内の各レベルについて書き込む IndentChars の数を定義します。

QuoteChar プロパティ

属性値を引用符で囲むときに使用する文字を定義します。一重引用符 &#39; または二重引用符 &#34; を使用する必要があります。

BaseStream

XmlTextWriter が書き込んでいる書き込み先のストリームを返します。StreamWriter から派生していない TextWriter によって XmlTextWriter が構築された場合は null を返します。

XmlTextWriter を使用して XML 出力を作成する例を次に示します。

Shared Sub WriteQuote(writer As XmlWriter, symbol As String, price As Double, change As Double, volume As Long)
   writer.WriteStartElement("Stock")
   writer.WriteAttributeString("Symbol", symbol)
   writer.WriteElementString("Price", XmlConvert.ToString(price))
   writer.WriteElementString("Change", XmlConvert.ToString(change))
   writer.WriteElementString("Volume", XmlConvert.ToString(volume))
   writer.WriteEndElement()
End Sub 'WriteQuote

Public Shared Sub Main()
   Dim writer As New XmlTextWriter(Console.Out)
   writer.Formatting = Formatting.Indented
   WriteQuote(writer, "MSFT", 74.125, 5.89, 69020000)
   writer.Close()
End Sub 'Main
static void WriteQuote(XmlWriter writer, string symbol, 
                double price, double change, long volume)
{
   writer.WriteStartElement("Stock");
   writer.WriteAttributeString("Symbol", symbol);
   writer.WriteElementString("Price", XmlConvert.ToString(price));
   writer.WriteElementString("Change", XmlConvert.ToString(change));
   writer.WriteElementString("Volume", XmlConvert.ToString(volume));
   writer.WriteEndElement();
}

public static void Main(){
    XmlTextWriter writer = new XmlTextWriter(Console.Out);
    writer.Formatting = Formatting.Indented;
    WriteQuote(writer, "MSFT", 74.125, 5.89, 69020000);
    writer.Close();
}

出力

<Stock Symbol="MSFT">
      <Price>74.125</Price>
      <Change>5.89</Change>
      <Volume>69020000</Volume>
</Stock>

WriteQuote メソッドへの入力は銘柄記号であり、string として入力されています。価格と変動は double として、出来高は long として宣言されています。これらの変数を文字列に変換するのに XmlConvert クラスを使用します。XmlConvert クラスには、厳密に型指定されるデータ型すべてを文字列に変換するメソッドがあります。また、XmlConvert クラスには、文字列を .NET Framework データ型に変換することによって逆の変換を行うメソッドもあります。詳細については、「XML 名の文字エンコードと XML データ型の変換」を参照してください。

ファイルに XML を書き込む方法を示すサンプル コードについては、XmlTextWriter.WriteProcessingInstruction を参照してください。コンソールに XML を書き込む方法を示すサンプル コードについては、XmlTextWriter.WriteString を参照してください。

次のコードは、<price>19.95</price> を生成する要素を書く方法を示しています。

'Write the price.writer.WriteElementString("price", "19.95")
//Write the price.writer.WriteElementString("price", "19.95");

次のコードは、<element name="purchaseOrder"/> を生成する属性を書く方法を示しています。

writer.WriteStartElement("element")
writer.WriteAttributeString("name", "purchaseOrder")
writer.WriteEndElement()
writer.WriteStartElement("element"); 
writer.WriteAttributeString("name", "purchaseOrder"); 
writer.WriteEndElement();

WriteAttributeString メソッドによる属性と名前空間宣言の書き込み

WriteAttributeString メソッドには 2 種類の異なる機能があります。1 つは、属性を書き込み、それをユーザー定義の名前空間プレフィックスに関連付ける機能です。もう 1 つは、名前空間宣言を生成する機能です。属性を書き込み、localname パラメーターが xmlns の場合、このメソッドは名前空間宣言を作成していると見なされます。

WriteAttributeString メソッドを使用して要素の内側に属性を書き込むコード サンプルを次に示します。

'Write the genre attribute.writer.WriteAttributeString("genre", "novel")
'Write the ISBN attribute.writer.WriteAttributeString("ISBN", "1-8630-014")
//Write the genre attribute.writer.WriteAttributeString("genre", "novel");
//Write the ISBN attribute.writer.WriteAttributeString("ISBN", "1-8630-014");

また、WriteAttributeString は、検出した内容に応じて属性のテキスト コンテンツをエスケープします。二重引用符が使用されている場合、XmlTextWriter は &quot; の付いた属性値のテキスト コンテンツに含まれる二重引用符をエスケープします。単一引用符が使用されている場合、&apos; の付いた属性値のテキスト コンテンツに含まれる単一引用符をエスケープします。

名前空間宣言を生成する場合は、名前空間宣言を定義できるアプリケーションを持つ、オーバーロードされた WriteAttributeString メソッドを使用します。2 つの既定の名前空間を作成するコード サンプルを次に示します。最初の宣言では、プレフィックスのない要素すべてがこの最初の名前空間宣言に結合され、"po" プレフィックスを使用して宣言された要素は 2 番目の名前空間宣言に結合されます。

' Write the default namespace, identified as xmlns with no prefix
writer.WriteAttributeString("xmlns", Nothing, "http://www.w3.org/2000/10/XMLSchema")
' Write a namespace for the purchase order with a prefix of "po"
writer.WriteAttributeString("xmlns", "po", Nothing, "https://contoso.com/po")
// Write the default namespace, identified as xmlns with no prefix
writer.WriteAttributeString("xmlns", null, "http://www.w3.org/2000/10/XMLSchema");
// Write a namespace for the purchase order with a prefix of "po"
writer.WriteAttributeString("xmlns", "po", null, "https://contoso.com/po");

Close メソッド

Close メソッドは、ストリームを閉じるときに XML ドキュメントが有効であることをチェックします。これにより、無効な XML ドキュメントを作成できなくなり、XML は常に整形式になります。Close メソッドは、ストリームを閉じるだけでなく、ドキュメントを閉じるのに必要なすべての WriteEnd<xxx> メソッドを呼び出します。

メソッド ペア

XmlWriter 内のメソッドはペアになっています。WriteStartDocumentWriteEndDocumentWriteStartElementWriteEndElementWriteStartAttributeWriteEndAttribute がそれぞれペアになっています。たとえば、これらのメソッドを使用すると、入れ子の要素や属性を作成できます。これらのメソッド ペアの使用によって、XML ドキュメントを構築し、複雑な要素や属性を作成できます。

WriteStartDocument メソッドと WriteEndDocument メソッド

WriteStartDocument で新しいドキュメントを開始し、バージョン属性が "1.0" に設定された XML 宣言を書き込みます。WriteEndDocument でそのドキュメントを閉じます。次のドキュメントを書き込むために次の WriteStartDocument を呼び出すまでの間、書式設定、インデント、その他のプロパティを変更できます。WriteStartDocument メソッドは、XML ドキュメントが書き込まれていることをプログラムで認識し、ルート レベル規則を適用します。このメソッドが使用されない場合は XML フラグメントが作成され、その XML フラグメントが整形式かどうかが確認されます。ルート レベル規則は適用されません。次のコード サンプルは、ドキュメント内の先頭と末尾を示します。

' Write the XML declaration.writer.WriteStartDocument()
...
'Close the document.writer.WriteEndDocument()
// Write the XML declaration.writer.WriteStartDocument();
...// Close the document.writer.WriteEndDocument();

WriteStartElement メソッドと WriteEndElement メソッド

WriteStartElementWriteEndElement のペアは、1 つ以上の要素を区切ります。オーバーライドされた WriteStartElement メソッドすべてにおいて、開始タグのローカル名は必須パラメーターです。WriteStartElementWriteEndElement のメソッド ペアを使用するコードを次に示します。

' Write the title.writer.WriteStartElement("title")
writer.WriteString("The Handmaid's Tale")
writer.WriteEndElement()
// Write the title.writer.WriteStartElement("title");
writer.WriteString("The Handmaid's Tale");
writer.WriteEndElement();

出力

<title>The Handmaid's Tale</title>

WriteStartElement には、オーバーライドされたメソッド シグネチャが用意されていて、これを使用することで要素の名前空間プレフィックスを指定できます。詳細については、「XmlTextWriter における要素の名前空間プレフィックス」を参照してください。

WriteStartAttribute メソッドと WriteEndAttribute メソッド

WriteStartAttributeWriteEndAttribute は、他の開始メソッドと終了メソッドに似ていますが、属性を開始および終了させる点が異なります。WriteStartAttribute は属性の開始を書き込み、WriteString メソッドを使用して属性値を書き込み、WriteEndAttribute は属性タグを終了させます。WriteStartAttributeWriteEndAttribute のメソッド ペアを示すコード サンプルを次に示します。

writer.WriteStartAttribute(prefix, "ISBN", "urn:samples")
writer.WriteString("1-861003-78")
writer.WriteEndAttribute()
writer.WriteStartAttribute(prefix, "ISBN", "urn:samples");
writer.WriteString("1-861003-78");
writer.WriteEndAttribute();

出力

<book bk:ISBN="1-861003-78">

WriteStartAttribute にはオーバーロードされたメソッドがあり、これを使用することでアプリケーションは、名前空間プレフィックスを指定し、アプリケーションが書き込む属性にその名前空間プレフィックスを関連付けることができます。詳細については、「XmlTextWriter における属性の名前空間プレフィックス」を参照してください。

参照

参照

XmlTextWriter

XmlTextWriter

XmlWriter

XmlWriter

概念

XmlTextWriter による XML 出力の書式設定

XmlTextWriter 内の名前空間機能

その他の技術情報

XmlWriter による XML の書き方