使用 XmlNamespaceManager 管理命名空間
更新: November 2007
XmlNamespaceManager 類別會保存命名空間 URI 和其前置詞的集合。 它可讓您解析、加入和移除集合中的命名空間。 在某些內容中需要使用它,才能改善 XML 處理效能。 例如,XmlNamespaceManager 是由 XsltContext 類別所使用,以提供 XPath 支援。 如需 XsltContext 類別的詳細資訊,請參閱 Microsoft 知識庫文件 Q324899 HOW TO: 當您在 Visual Basic .NET 中執行 XPath 查詢時,實作與使用自訂的延伸功能。
如需 C# 語言的相同範例,請參閱 Microsoft 知識庫文件 Q324462 HOW TO: 當您在 Visual C# .NET 中執行 XPath 查詢時,實作與使用自訂的延伸功能。
注意事項: |
---|
如果您正在使用 LINQ to XML,不會使用 XmlNamespaceManager 來管理命名空間。 如需在使用 LINQ to XML 時管理命名空間的資訊,請參閱使用 XML 命名空間。 |
命名空間
當命名空間管理員建立之後,會在類別中自動加入三個前置詞。 下表列出這三個前置詞,以及它們所代表的命名空間。
前置詞 |
命名空間 |
---|---|
xmlns |
http://www.w3.org/2000/xmlns/ |
xml |
http://www.w3.org/XML/1998/namespace |
String.Empty |
空的命名空間。 這個值可指派給前置詞。 例如, 可以將預設的命名空間定義成空的命名空間。 |
若要將命名空間加入至命名空間管理員內,請建立一個命名空間管理員,然後使用 AddNamespace 方法。 在建立命名空間管理員時,可使用 XmlTextReader、XsltContext 或 XmlDocument 類別中的 NameTable。 會使用 AddNamespace 方法建立自訂 XmlNamespaceManager 物件,並將適當的命名空間宣告填入其中。 XmlNamespaceManager 會當做參數提供給 XmlDocument 類別的 SelectNodes 或 SelectSingleNode 方法,以執行參考符合命名空間的項目和屬性名稱的 XPath 查詢運算式。 加入命名空間時將有下列幾項假設:
前置詞和命名空間已完成確認,且它們都遵循 W3C Namespaces 規格。 命名空間管理員不會在命名空間上執行任何驗證。
使用 AddNamespace 方法加入字串時,命名空間管理員會儘量分割字串。
當使用 LookupNamespace 或 LookupPrefix 方法執行查閱時,命名空間管理員會分割字串。
預設的前置詞和命名空間配對會在建立時自動加入命名空間管理員內。
命名空間管理員除了會加入和擷取命名空間之外,還會實作列舉型別支援。 您可以使用 foreach 建構,逐一查看命名空間管理員內所儲存的資訊。 假設命名空間管理員是以 nsmanager 名稱建立,則您可以使用 foreach (String prefix in nsmanager) 逐一查看資料表。
因為命名空間管理員會提供一個將前置詞和命名空間當做物件的字串比較功能,所以使用命名空間管理員的效能會比直接比較字串來得高。
若要將命名空間加入至命名空間管理員中,請使用 AddNamespace 方法。 下列程式碼範例顯示如何繫結前置詞 xsd 與 http://www.w3.org/2001/XMLSchema 的命名空間 URI:
nsmgr.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema")
nsmgr.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema");
範例
下列程式碼範例會示範如何接著使用 LookupNamespace 方法尋找命名空間:
nsmgr.LookupNamespace("xsd")
nsmgr.LookupNamespace("xsd");
如需加入和擷取命名空間的較完整範例,請參閱 LookupNamespace 方法。
下列程式碼範例會從讀取器使用 NameTable 來建立 XmlNamespaceManager。
Dim reader As New XmlTextReader("myfile.xml")
Dim nsmanager As New XmlNamespaceManager(reader.NameTable)
nsmanager.AddNamespace("msbooks", "www.microsoft.com/books")
nsmanager.PushScope()
nsmanager.AddNamespace("msstore", "www.microsoft.com/store")
While reader.Read()
Console.WriteLine("Reader Prefix:{0}", reader.Prefix)
Console.WriteLine("XmlNamespaceManager Prefix:{0}",
nsmanager.LookupPrefix(nsmanager.NameTable.Get(reader.NamespaceURI)))
End While
XmlTextReader reader = new XmlTextReader("myfile.xml");
XmlNamespaceManager nsmanager = new XmlNamespaceManager(reader.NameTable);
nsmanager.AddNamespace("msbooks", "www.microsoft.com/books");
nsmanager.PushScope();
nsmanager.AddNamespace("msstore", "www.microsoft.com/store");
while (reader.Read())
{
Console.WriteLine("Reader Prefix:{0}", reader.Prefix);
Console.WriteLine("XmlNamespaceManager Prefix:{0}",
nsmanager.LookupPrefix(nsmanager.NameTable.Get(reader.NamespaceURI)));
}