Classe System.Xml.Linq.XName
Este artigo fornece observações complementares à documentação de referência para essa API.
Os nomes XML incluem um namespace e um nome local. Um nome totalmente qualificado é a combinação do namespace e do nome local.
Criar um objeto XName
XName não contém nenhum construtor público. Em vez disso, essa classe fornece uma conversão implícita de String que permite que você crie um XName. O local mais comum de uso dessa conversão é na construção de um elemento ou atributo: o primeiro argumento do construtor XElement é um XName. Ao passar uma cadeia de caracteres, você aproveita a conversão implícita. O código a seguir cria um elemento com um nome que não está em nenhum namespace:
XElement root = new XElement("ElementName", "content");
Console.WriteLine(root);
No Visual Basic, é mais apropriado utilizar literais XML:
Dim root As XElement = <ElementName>content</ElementName>
Console.WriteLine(root)
Esse exemplo gera a saída a seguir:
<ElementName>content</ElementName>
A atribuição de uma cadeia de caracteres a um XName usa a conversão implícita de String.
O exemplo do Visual Basic cria o XElement usando literais XML. Mesmo que sejam usados literais XML, um objeto XName é criado para o XElement.
Além disso, você pode chamar o método Get para um objeto XName. No entanto, a maneira recomendada é utilizar a conversão implícita de cadeia de caracteres.
Criar um XName em um namespace
Assim como no XML, um XName pode estar em um namespace ou pode não estar em nenhum namespace.
No C#, a abordagem recomendada para criar um XName em um namespace é declarar o objeto XNamespace e, em seguida, usar a substituição do operador de adição.
Para o Visual Basic, a abordagem recomendada é utilizar literais XML e declarações de namespace globais para criar uma linguagem XML que esteja em um namespace.
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "ElementName", "content");
Console.WriteLine(root);
Imports <xmlns="http://www.adventure-works.com">
Module Module1
Sub Main()
Dim root As XElement = <ElementName>content</ElementName>
Console.WriteLine(root)
End Sub
End Module
Esse exemplo gera a saída a seguir:
<ElementName xmlns="http://www.adventure-works.com">content</ElementName>
Não criar um XName em um namespace
É garantido que a propriedade Namespace de um objeto XName não seja nula. Se XName não estiver em um namespace, a propriedade Namespace será definida como None. O código a seguir demonstra isso:
XElement root = new XElement("ElementName", "content");
if (root.Name.Namespace == XNamespace.None)
Console.WriteLine("The element is in no namespace.");
else
Console.WriteLine("The element is in a namespace.");
Dim root As XElement = <ElementName>content</ElementName>
If (root.Name.Namespace Is XNamespace.None) Then
Console.WriteLine("The element is in no namespace.")
Else
Console.WriteLine("The element is in a namespace.")
End If
Esse exemplo gera a saída a seguir:
The element is in no namespace.
Use nomes expandidos
Você também pode criar um XName a partir de um nome XML expandido no formato {namespace}localname
:
XElement root = new XElement("{http://www.adventure-works.com}ElementName", "content");
Console.WriteLine(root);
Dim root As XElement = New XElement("{http://www.adventure-works.com}ElementName", "content")
Console.WriteLine(root)
Esse exemplo gera a saída a seguir:
<ElementName xmlns="http://www.adventure-works.com">content</ElementName>
Lembre-se de que criar um XName por meio de um nome expandido é menos eficiente do que criar um objeto XNamespace e usar a substituição do operador de adição. Também é menos eficiente do que importar um namespace global e utilizar literais XML no Visual Basic.
Se você criar um XName usando um nome expandido, o LINQ to XML deverá encontrar a instância atomizada de um namespace. Esse trabalho deve ser repetido para cada uso de um nome expandido. É provável que esse tempo adicional seja insignificante ao escrever consultas LINQ; no entanto, ele pode ser significativo ao criar uma grande árvore de XML.
Os objetos XName são atomizados
É garantido que os objetos XName sejam atomizados; ou seja, se dois objetos XName tiverem exatamente o mesmo namespace e exatamente o mesmo nome local, eles compartilharão a mesma instância. Os operadores de igualdade e comparação também são fornecidos explicitamente para essa finalidade.
Entre outros benefícios, esse recurso permite a execução mais rápida de consultas. Ao filtrar pelo nome de elementos ou atributos, as comparações expressas em predicados usam a comparação de identidade, não a comparação de valores. É muito mais rápido determinar se duas referências realmente se referem ao mesmo objeto do que comparar duas cadeias de caracteres.