Compartilhar via


Classe System.Xml.Linq.XName

Este artigo fornece comentários complementares à documentação de referência para esta 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 uma XName. O lugar mais comum que você usa essa conversão é ao construir um elemento ou atributo: o primeiro argumento para o XElement construtor é 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á no 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)

Este exemplo produz a seguinte saída:

<ElementName>content</ElementName>

Atribuir 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 literais XML sejam usados, um XName objeto é criado para o XElement.

Além disso, você pode chamar o Get método para um XName objeto. 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 estar em nenhum namespace.

Para C#, a abordagem recomendada para criar um XName em um namespace é declarar o objeto XNamespace e então usar a sobrecarga do operador de adição.

Para o Visual Basic, a abordagem recomendada é usar literais XML e declarações de namespace globais para criar 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

Este exemplo produz a seguinte saída:

<ElementName xmlns="http://www.adventure-works.com">content</ElementName>

Criar um XName sem namespace

A Namespace propriedade de um XName objeto tem a garantia de não ser nula. Se a XName propriedade não estiver em nenhum namespace, a Namespace propriedade 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

Este exemplo produz a seguinte saída:

The element is in no namespace.

Usar nomes expandidos

Você também pode criar um XName a partir de um nome XML expandido na forma {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)

Este exemplo produz a seguinte saída:

<ElementName xmlns="http://www.adventure-works.com">content</ElementName>

Lembre-se de que criar um XName através de um nome expandido é menos eficiente do que criar um objeto XNamespace e usar a sobrecarga do operador de adição. Também é menos eficiente do que importar um namespace global e usar literais XML no Visual Basic.

Se você criar um XName usando um nome expandido, LINQ to XML precisa 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, pode ser significativo ao criar uma árvore XML grande.

Objetos XName são atomizados

XName os objetos têm a garantia de serem atomizados; ou seja, se dois XName objetos 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 o nome de elementos ou atributos, as comparações expressas em predicados usam comparação de identidade, não comparação de valor. É muito mais rápido determinar que duas referências realmente se referem ao mesmo objeto do que comparar duas cadeias de caracteres.