在 XmlWriter 中處理命名空間
更新: November 2007
命名空間用於對 XML 文件中的項目與屬性名稱進行限定。命名空間前置詞會建立項目及屬性與命名空間的關聯,再由命名空間關聯到 URI 參考。命名空間會在 XML 文件中建立項目和屬性名稱唯一性。
XmlWriter 維護命名空間堆疊,其對應目前命名空間範圍中定義的所有命名空間。當寫入項目及屬性時,可透過下列方式利用命名空間:
手動宣告命名空間。
使用新的命名空間覆寫目前的命名空間宣告。
寫入屬性或項目時,指定命名空間前置詞。
手動宣告命名空間
可以使用 WriteAttributeString 方法,手動寫出命名空間宣告。當知道如何最佳化命名空間宣告數目時,這便會很有用。在下列程式碼中,命名空間宣告建立在根項目上。
writer.WriteStartElement("root")
writer.WriteAttributeString("xmlns", "x", Nothing, "urn:1")
writer.WriteStartElement("item", "urn:1")
writer.WriteEndElement()
writer.WriteStartElement("item", "urn:1")
writer.WriteEndElement()
writer.WriteEndElement()
writer.WriteStartElement("root");
writer.WriteAttributeString("xmlns", "x", null, "urn:1");
writer.WriteStartElement("item","urn:1");
writer.WriteEndElement();
writer.WriteStartElement("item","urn:1");
writer.WriteEndElement();
writer.WriteEndElement();
程式碼會產生下列 XML 字串。
<root xmlns:x="urn:1">
<x:item/>
<x:item/>
</root>
由於命名空間宣告位於 root 項目上,因此它不會在兩個項目子系上重複。item 項目也會從命名空間宣告中挑選前置詞。
覆寫目前的命名空間
可以手動覆寫與指定前置詞關聯的命名空間。在下列程式碼中,"x" 前置詞的命名空間 URI 從 "123" 變為 "abc"。
writer.WriteStartElement("x", "root", "123")
writer.WriteStartElement("item")
writer.WriteAttributeString("xmlns", "x", Nothing, "abc")
writer.WriteEndElement()
writer.WriteEndElement()
writer.WriteStartElement("x","root","123");
writer.WriteStartElement("item");
writer.WriteAttributeString("xmlns","x",null,"abc");
writer.WriteEndElement();
writer.WriteEndElement();
程式碼會產生下列 XML 字串:
<x:root xmlns:x="123">
<item xmlns:x="abc" />
</x:root>
指定命名空間前置詞
您也可藉由在寫入項目或屬性時,明確指定前置詞,來傳遞要使用的命名空間前置詞。很多用於寫入項目及屬性的方法可讓您指定命名空間前置詞。下列程式碼顯示如何在寫入項目時指定前置詞。
writer.WriteStartElement("x", "root", "urn:1")
writer.WriteStartElement("y", "item", "urn:1")
writer.WriteEndElement()
writer.WriteEndElement()
writer.WriteStartElement("x","root","urn:1");
writer.WriteStartElement("y","item","urn:1");
writer.WriteEndElement();
writer.WriteEndElement();
程式碼會寫入下列 XML 字串:
<x:root xmlns:x="urn:1">
<y:item xmlns:y="urn:1"/>
</x:root>
XmlWriter 同時保留了 "x" 及 "y" 前置詞。
![]() |
---|
所有 XmlWriter 實作 (包括 XmlTextWriter) 都允許在提供前置詞時,命名空間為空。在這種情況下,寫入器會忽略前置詞。這是 Microsoft .NET Framework 2.0 版中行為的變更。在先前版本中,這種狀況會導致擲回 XmlException。 |