名前空間は、XML ドキュメント内の要素名と属性名を修飾する技術です。名前空間プリフィックスは、要素と属性を名前空間に関連付けます。名前空間は URI 参照に関連付けられます。名前空間は、XML ドキュメントの中の要素名と属性名を一意にします。
XmlTextWriter には、アプリケーションがさまざまな方法で名前空間を宣言できるように複数のメソッドが用意されています。メソッドによって実行できるタスクを次に示します。
- 手動で名前空間を宣言する。
- 現在の名前空間宣言を新しい名前空間でオーバーライドする。
- 複数の名前空間を宣言する。
名前空間を宣言する以外に、名前空間プリフィックスを要素と属性に追加できます。属性の名前空間プリフィックスを書くときに使用するメソッドを次に示します。
- WriteAttributes
- WriteAttributeString
- WriteStartAttribute
属性のプリフィックスの書き方の詳細については、「XmlTextWriter における属性の名前空間プリフィックス」を参照してください。
要素の名前空間プリフィックスを書くときに使用するメソッドを次に示します。
- WriteElement
- WriteElementString
- WriteStartElement
要素のプリフィックスの書き方の詳細については、「XmlTextWriter における要素の名前空間プリフィックス」を参照してください。
ライタは、要素で定義された名前空間を追跡に使用する名前空間スタックを維持します。次のコード例では、要素を書き出すときの名前空間スタックの使い方を示しています。
Dim w As New XmlTextWriter(Console.Out)
w.WriteStartElement("root", "urn:1")
w.WriteStartElement("item", "urn:2")
w.WriteEndElement()
w.WriteEndElement()
w.Close()
[C#]
XmlTextWriter w = new XmlTextWriter(Console.Out);
w.WriteStartElement("root","urn:1");
w.WriteStartElement("item","urn:2");
w.WriteEndElement();
w.WriteEndElement();
w.Close();
出力
<root xmlns="urn:1">
<item xmlns="urn:2"/>
</root>
重複する名前空間宣言が入れ子の要素で使用されている場合の結果を次の例に示します。出力を見ると、空の item 要素では名前空間宣言が繰り返されていません。
Dim w As New XmlTextWriter(Console.Out)
w.WriteStartElement("root", "urn:1")
w.WriteStartElement("item", "urn:1")
w.WriteEndElement()
w.WriteEndElement()
w.Close()
[C#]
XmlTextWriter w = new XmlTextWriter(Console.Out);
w.WriteStartElement("root","urn:1");
w.WriteStartElement("item","urn:1");
w.WriteEndElement();
w.WriteEndElement();
w.Close();
出力
<root xmlns="urn:1"><item/></root>
XmlTextWriter による手動の名前空間宣言
名前空間宣言の数を最適化するために、名前空間宣言を手動で書き込むことができます。名前空間宣言の数を最適化する方法を示すコード例を次に示します。
w.WriteStartElement("root")
w.WriteAttributeString("xmlns", "x", Nothing, "urn:1")
w.WriteStartElement("item", "urn:1")
w.WriteEndElement()
w.WriteStartElement("item", "urn:1")
w.WriteEndElement()
w.WriteEndElement()
[C#]
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();
出力
<root xmlns:x="urn:1">
<x:item/>
<x:item/>
</x:root>
前のコード例は、2 つの子要素で名前空間の宣言が重複しないように、root 要素で名前空間を宣言しています。item 要素にも、名前空間宣言からのプリフィックスが適用されます。
XmlTextWriter による名前空間宣言のオーバーライド
プリフィックスに関連付けられた名前空間を手動でオーバーライドする方法を示すコード例を次に示します。この例では、order 値が元の名前空間 URI 123 をオーバーライドします。これによって、新しい要素スコープ内に名前空間を再定義できます。
w.WriteStartElement("x", "node", "123")
w.WriteAttributeString("xmlns", "x", Nothing, "order")
[C#]
w.WriteStartElement("x","node","123");
w.WriteAttributeString("xmlns","x",null,"order");
出力
<x:node xmlns:x="order"/>
XmlTextWriter による複数の名前空間宣言
複数の名前空間宣言があって、同じ URN (Uniform Resource Name) に異なるプリフィックスが割り当てられている場合、XmlWriter クラスは名前空間宣言のスタックを上に戻って最も近いプリフィックスを使用します。次のコード例では、XmlWriter が最初に y プリフィックスを見つけるようにするため、WriteAttributeString でプリフィックスを指定しない方法を示します。
Dim w As New XmlTextWriter(Console.Out)
w.WriteStartElement("x", "root", "urn:1")
w.WriteStartElement("y", "item", "urn:1")
w.WriteAttributeString("abc", "urn:1", "xyz")
w.WriteEndElement()
w.WriteEndElement()
w.Close()
[C#]
XmlTextWriter w = new XmlTextWriter(Console.Out);
w.WriteStartElement("x","root","urn:1");
w.WriteStartElement("y","item","urn:1");
w.WriteAttributeString("abc","urn:1","xyz");
w.WriteEndElement();
w.WriteEndElement();
w.Close();
出力
<x:root xmlns:x="urn:1">
<y:item y:abc="xyz" xmlns:y="urn:1"/>
</x:root>
参照
XmlWriter による XML の書き方 | XmlTextWriter による適切な形式の XML の作成 | XmlTextWriter による XML 出力の書式設定 | XmlTextWriter 内の名前空間機能 | カスタマイズされた XML ライタの作成 | XmlTextWriter クラス | XmlTextWriter メンバ | XmlWriter クラス | XmlWriter メンバ