XmlTextWriter 内の名前空間機能
更新 : November 2007
名前空間は、XML ドキュメント内の要素名と属性名を修飾する技術です。名前空間プレフィックスは、要素と属性を名前空間に関連付けます。名前空間は URI (Uniform Resource Identifier) 参照に関連付けられます。名前空間は、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()
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()
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()
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")
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()
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>