Classe System.Xml.Linq.XNamespace
Este artigo fornece observações complementares à documentação de referência para essa API.
Essa classe representa a construção XML de namespaces.
Cada XName contém um XNamespace. Mesmo que um elemento não esteja em um namespace, o XName do elemento ainda contém um namespace, XNamespace.None. A propriedade XName.Namespace é garantida para não ser null
.
Criar um objeto de XNamespace
A maneira mais comum de criar um objeto XNamespace é simplesmente atribuir uma cadeia de caracteres a ele. Em seguida, você pode combinar o namespace com um nome local usando a substituição do operador de adição. O seguinte exemplo mostra essa expressão:
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root", "Content");
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", "Content")
Console.WriteLine(root)
No entanto, no Visual Basic, você normalmente declararia um namespace de padrão global, da seguinte maneira:
Imports <xmlns='http://www.adventure-works.com'>
Module Module1
Sub Main()
Dim root As XElement = _
<Root>Content</Root>
Console.WriteLine(root)
End Sub
End Module
Esse exemplo gera a saída a seguir:
<Root xmlns="http://www.adventure-works.com">Content</Root>
A atribuição de uma cadeia de caracteres a um XNamespace usa a conversão implícita do String.
Consulte Como criar um documento com namespaces em C# (LINQ to XML) para obter mais informações e exemplos.
Consulte Trabalhar com namespaces de XML para obter mais informações sobre como usar namespaces no Visual Basic.
Controlar prefixos de namespace
Se você criar um atributo que declare um namespace, o prefixo especificado no atributo será persistido no XML serializado. Para criar um atributo que declare um namespace com um prefixo, você cria um atributo onde o namespace do nome do atributo é Xmlns, e o nome do atributo é o prefixo do namespace. O valor do atributo é o URI do namespace. O seguinte exemplo mostra essa expressão:
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
"Content");
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", _
New XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"), _
"Content")
Console.WriteLine(root)
No Visual Basic, em vez de criar um nó de namespace para controlar prefixos de namespace, você normalmente usaria uma declaração de namespace global:
Imports <xmlns:aw='http://www.adventure-works.com'>
Module Module1
Sub Main()
Dim root As XElement = _
<aw:Root>Content</aw:Root>
Console.WriteLine(root)
End Sub
End Module
Esse exemplo gera a saída a seguir:
<aw:Root xmlns:aw="http://www.adventure-works.com">Content</aw:Root>
Para obter mais informações, consulte Como controlar os prefixos de namespace.
Criar um namespace padrão
Ao construir um atributo que será um namespace, se o nome do atributo tiver o valor especial de "xmlns", quando a árvore de XML for serializada, o namespace será declarado como o namespace padrão. O atributo especial com o nome de "xmlns" em si não está em nenhum namespace. O valor do atributo é o URI do namespace.
O exemplo a seguir cria uma árvore de XML que contém um atributo que é declarado de tal forma que o namespace se tornará o namespace padrão:
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
new XAttribute("xmlns", "http://www.adventure-works.com"),
new XElement(aw + "Child", "content")
);
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", _
New XAttribute("xmlns", "http://www.adventure-works.com"), _
New XElement(aw + "Child", "content") _
)
Console.WriteLine(root)
No Visual Basic, em vez de criar um nó de namespace para criar um namespace padrão, você normalmente usaria uma declaração de namespace padrão global:
Imports <xmlns='http://www.adventure-works.com'>
Module Module1
Sub Main()
Dim root As XElement = _
<Root>
<Child>content</Child>
</Root>
Console.WriteLine(root)
End Sub
End Module
Esse exemplo gera a saída a seguir:
<Root xmlns="http://www.adventure-works.com">
<Child>content</Child>
</Root>
Atomização de XNamespace
É garantido que os objetos XNamespace sejam atomizados, ou seja, se dois objetos XNamespace tiverem exatamente o mesmo URI, eles compartilharão a mesma instância. Os operadores de comparação e igualdade também são fornecidos explicitamente para essa finalidade.
Usar nomes expandidos
Outra maneira de especificar um namespace e um nome local é usar um nome expandido no formato {namespace}name
:
XElement e = new XElement("{http://www.adventure-works.com}Root",
new XAttribute("{http://www.adventure-works.com}Att", "content")
);
Console.WriteLine(e);
Dim e As XElement = New XElement("{http://www.adventure-works.com}Root", _
New XAttribute("{http://www.adventure-works.com}Att", "content") _
)
Console.WriteLine(e)
Esse exemplo gera a saída a seguir:
<Root p1:Att="content" xmlns:p1="http://www.adventure-works.com" xmlns="http://www.adventure-works.com" />
Essa abordagem tem implicações de desempenho. Toda vez que você passa uma cadeia de caracteres que contém um nome expandido para o LINQ to XML, o LINQ to XML deve analisar o nome, localizar o namespace atomizado e localizar o nome atomizado. Esse processo utiliza tempo de CPU. Se o desempenho for importante, talvez você queira usar uma abordagem diferente.
Com o Visual Basic, a abordagem recomendada é usar literais do XML, que não envolve o uso de nomes expandidos.