Partilhar via


Criar árvores XML em C# (LINQ to XML)

Este artigo fornece informações sobre como criar árvores XML em C#.

Para obter informações sobre como usar os resultados de consultas LINQ como o conteúdo de um XElement, consulte Construção funcional.

Elementos de construção

As assinaturas dos XElement construtores e XAttribute permitem que você passe o conteúdo do elemento ou atributo como argumentos para o construtor. Como um dos construtores usa um número variável de argumentos, você pode passar qualquer número de elementos filho. É claro que cada um desses elementos filho pode conter seus próprios elementos filho. Para qualquer elemento, você pode adicionar qualquer número de atributos.

Ao adicionar XNode (incluindo XElement) ou XAttribute objetos, se o novo conteúdo não tiver pai, os objetos serão simplesmente anexados à árvore XML. Se o novo conteúdo já for pai e fizer parte de outra árvore XML, o novo conteúdo será clonado e o conteúdo recém-clonado será anexado à árvore XML. O último exemplo neste artigo demonstra isso.

Para criar um contacts XElement, você pode usar o seguinte código:

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),
            new XElement("Phone", "206-555-0144"),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );

Se recuado corretamente, o código para construir XElement objetos se assemelha muito à estrutura do XML subjacente.

XElement construtores

A XElement classe usa os seguintes construtores para construção funcional. Observe que existem alguns outros construtores para XElement, mas como eles não são usados para construção funcional, eles não estão listados aqui.

Construtor Description
XElement(XName name, object content) Cria um XElementarquivo . O name parâmetro especifica o nome do elemento; content especifica o conteúdo do elemento.
XElement(XName name) Cria um XElement com seu XName inicializado para o nome especificado.
XElement(XName name, params object[] content) Cria um XElement com seu XName inicializado para o nome especificado. Os atributos e/ou elementos filho são criados a partir do conteúdo da lista de parâmetros.

O content parâmetro é extremamente flexível. Ele suporta qualquer tipo de objeto que seja um filho válido de um XElementarquivo . As regras a seguir se aplicam a diferentes tipos de objetos passados nesse parâmetro:

  • Uma cadeia de caracteres é adicionada como conteúdo de texto.
  • Um XElement é adicionado como um elemento filho.
  • Um XAttribute é adicionado como um atributo.
  • Um XProcessingInstruction, XComment, ou XText é adicionado como conteúdo filho.
  • Um IEnumerable é enumerado e essas regras são aplicadas recursivamente aos resultados.
  • Para qualquer outro tipo, seu ToString método é chamado e o resultado é adicionado como conteúdo de texto.

Exemplo: Criar um XElement com conteúdo

Você pode criar um XElement que contém conteúdo simples com uma única chamada de método. Para fazer isso, especifique o conteúdo como o segundo parâmetro, da seguinte maneira:

XElement n = new XElement("Customer", "Adventure Works");
Console.WriteLine(n);

Este exemplo produz a seguinte saída:

<Customer>Adventure Works</Customer>

Você pode passar qualquer tipo de objeto como conteúdo. Por exemplo, o código a seguir cria um elemento que contém um número de ponto flutuante como conteúdo:

XElement n = new XElement("Cost", 324.50);
Console.WriteLine(n);

Este exemplo produz a seguinte saída:

<Cost>324.5</Cost>

O número de ponto flutuante é encaixotado e passado para o construtor. O número em caixa é convertido em uma cadeia de caracteres e usado como o conteúdo do elemento.

Exemplo: Criar um XElement com um elemento filho

Se você passar uma instância da XElement classe para o argumento content, o construtor criará um elemento com um elemento filho:

XElement shippingUnit = new XElement("ShippingUnit",
    new XElement("Cost", 324.50)
);
Console.WriteLine(shippingUnit);

Este exemplo produz a seguinte saída:

<ShippingUnit>
  <Cost>324.5</Cost>
</ShippingUnit>

Exemplo: Criar um XElement com vários elementos filho

Você pode passar vários XElement objetos para o conteúdo. Cada um dos XElement objetos é incluído como um elemento filho.

XElement address = new XElement("Address",
    new XElement("Street1", "123 Main St"),
    new XElement("City", "Mercer Island"),
    new XElement("State", "WA"),
    new XElement("Postal", "68042")
);
Console.WriteLine(address);

Este exemplo produz a seguinte saída:

<Address>
  <Street1>123 Main St</Street1>
  <City>Mercer Island</City>
  <State>WA</State>
  <Postal>68042</Postal>
</Address>

Estendendo o exemplo anterior, você pode criar uma árvore XML inteira, da seguinte maneira:

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),
            new XElement("Phone", "206-555-0144"),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );
Console.WriteLine(contacts);

Este exemplo produz a seguinte saída:

<Contacts>
  <Contact>
    <Name>Patrick Hines</Name>
    <Phone>206-555-0144</Phone>
    <Address>
      <Street1>123 Main St</Street1>
      <City>Mercer Island</City>
      <State>WA</State>
      <Postal>68042</Postal>
    </Address>
  </Contact>
</Contacts>

Exemplo: Criar um XElement com um XAttribute

Se você passar uma instância da XAttribute classe para o argumento content, o construtor criará um elemento com um atributo:

XElement phone = new XElement("Phone",
    new XAttribute("Type", "Home"),
    "555-555-5555");
Console.WriteLine(phone);

Este exemplo produz a seguinte saída:

<Phone Type="Home">555-555-5555</Phone>

Exemplo: Criar um elemento vazio

Para criar um vazio XElement, não passe nenhum conteúdo para o construtor. O exemplo a seguir cria um elemento vazio:

XElement n = new XElement("Customer");
Console.WriteLine(n);

Este exemplo produz a seguinte saída:

<Customer />

Exemplo: Anexar vs. clonar

Como mencionado anteriormente, ao adicionar XNode (incluindo XElement) ou XAttribute objetos, se o novo conteúdo não tiver pai, os objetos serão simplesmente anexados à árvore XML. Se o novo conteúdo já for pai e fizer parte de outra árvore XML, o novo conteúdo será clonado e o conteúdo recém-clonado será anexado à árvore XML.

O exemplo a seguir demonstra o comportamento quando você adiciona um elemento pai a uma árvore e quando adiciona um elemento sem pai a uma árvore:

// Create a tree with a child element.
XElement xmlTree1 = new XElement("Root",
    new XElement("Child1", 1)
);

// Create an element that's not parented.
XElement child2 = new XElement("Child2", 2);

// Create a tree and add Child1 and Child2 to it.
XElement xmlTree2 = new XElement("Root",
    xmlTree1.Element("Child1"),
    child2
);

// Compare Child1 identity.
Console.WriteLine("Child1 was {0}",
    xmlTree1.Element("Child1") == xmlTree2.Element("Child1") ?
    "attached" : "cloned");

// Compare Child2 identity.
Console.WriteLine("Child2 was {0}",
    child2 == xmlTree2.Element("Child2") ?
    "attached" : "cloned");

// This example produces the following output:
//    Child1 was cloned
//    Child2 was attached

Consulte também