Visão geral do LINQ to XML

O LINQ to XML fornece uma interface de programação XML na memória que aproveita a .NET LINQ (Consulta Integrada à Linguagem) Framework. O LINQ to XML usa os recursos do .NET e pode ser comparado a uma interface de programação XML de Modelo de Objeto do Documento (DOM) atualizada e reprojetada.

O XML tem sido amplamente adotado como um modo de formatar dados em muitos contextos. Por exemplo, você pode encontrar XML na Web, em arquivos de configuração, em arquivos do Microsoft Office Word e em bancos de dados.

O LINQ to XML é uma abordagem atualizada e redesenhada para a programação com XML. Ele oferece os recursos de modificação de documentos na memória do DOM (Document Object Model), bem como o suporte a expressões de consulta LINQ. Embora essas expressões de consulta sejam sintaticamente diferentes de XPath, elas oferecem uma funcionalidade semelhante.

Desenvolvedores em LINQ to XML

O LINQ to XML se destina a uma variedade de desenvolvedores. Para um desenvolvedor médio que deseja apenas ter algo concluído, o LINQ to XML torna o XML mais simples ao oferecer uma experiência de consulta que é semelhante ao SQL. Com apenas um pouco de estudo, os programadores podem aprender a escrever consultas sucintas e eficientes na linguagem de programação de sua escolha.

Os desenvolvedores profissionais podem usar o LINQ to XML para aumentar consideravelmente sua produtividade. Com o LINQ to XML, eles podem escrever um código menor que seja mais expressivo, mais compacto e mais eficiente. Eles podem usar expressões de consulta de vários domínios de dados ao mesmo tempo.

O LINQ to XML é uma interface de programação XML

O LINQ to XML é uma interface de programação XML na memória e habilitada para LINQ que permite que você trabalhe com XML de dentro das linguagens de programação do .NET.

O LINQ to XML é como o DOM (Modelo de Objeto do Documento) no sentido de levar o documento XML para a memória. Você pode consultar e modificar o documento e, depois de modificá-lo, pode salvá-lo em um arquivo ou serializá-lo e enviá-lo pela Internet. No entanto, o LINQ to XML difere do DOM:

  • Ele fornece um novo modelo de objeto que é mais leve e mais fácil de trabalhar.
  • Ele aproveita os recursos de linguagem em C# e Visual Basic.

A vantagem mais importante do LINQ to XML é sua integração com a consulta integrada à linguagem (LINQ). Essa integração permite que você escreva consultas no documento XML na memória para recuperar coleções de elementos e atributos. O recurso de consulta do LINQ to XML é comparável em funcionalidade (embora não em sintaxe) à XPath e à XQuery. A integração do LINQ na C# e no Visual Basic oferece tipagem mais forte, verificação em tempo de compilação e melhor suporte de depuração.

Outra vantagem do LINQ to XML é a capacidade de usar resultados da consulta como parâmetros para construtores de objeto XElement e XAttribute, o que permite uma abordagem eficiente para a criação de árvores XML. Essa abordagem, chamada de construção funcional, permite que os desenvolvedores transformem com facilidade árvores XML de uma forma em outra.

Por exemplo, você pode ter uma ordem de compra em XML típica, conforme descrito em Arquivo XML de exemplo: ordem de compra típica. Usando o LINQ to XML, você poderia executar a consulta a seguir para obter o valor do atributo de número de peça para cada elemento de item na ordem de compra:

// Load the XML file from our project directory containing the purchase orders
var filename = "PurchaseOrder.xml";
var currentDirectory = Directory.GetCurrentDirectory();
var purchaseOrderFilepath = Path.Combine(currentDirectory, filename);

XElement purchaseOrder = XElement.Load(purchaseOrderFilepath);

IEnumerable<string> partNos =  from item in purchaseOrder.Descendants("Item")
                               select (string) item.Attribute("PartNumber");
' Load the XML file from our project directory containing the purchase orders
Dim filename = "PurchaseOrder.xml"
Dim currentDirectory = Directory.GetCurrentDirectory()
Dim purchaseOrderFilepath = Path.Combine(currentDirectory, filename)

Dim purchaseOrder As XElement = XElement.Load(purchaseOrderFilepath)

Dim partNos = _
    From item In purchaseOrder...<Item> _
    Select item.@PartNumber

Na C#, isso pode ser regravado no formulário de sintaxe do método:

IEnumerable<string> partNos = purchaseOrder.Descendants("Item").Select(x => (string) x.Attribute("PartNumber"));

Como outro exemplo, você poderia querer uma lista, classificada por número de peça, dos itens com um valor maior que $ 100. Para obter essas informações, você poderia executar a seguinte consulta:

// Load the XML file from our project directory containing the purchase orders
var filename = "PurchaseOrder.xml";
var currentDirectory = Directory.GetCurrentDirectory();
var purchaseOrderFilepath = Path.Combine(currentDirectory, filename);

XElement purchaseOrder = XElement.Load(purchaseOrderFilepath);

IEnumerable<XElement> pricesByPartNos =  from item in purchaseOrder.Descendants("Item")
                                 where (int) item.Element("Quantity") * (decimal) item.Element("USPrice") > 100
                                 orderby (string)item.Element("PartNumber")
                                 select item;
' Load the XML file from our project directory containing the purchase orders
Dim filename = "PurchaseOrder.xml"
Dim currentDirectory = Directory.GetCurrentDirectory()
Dim purchaseOrderFilepath = Path.Combine(currentDirectory, filename)

Dim purchaseOrder As XElement = XElement.Load(purchaseOrderFilepath)

Dim partNos = _
From item In purchaseOrder...<Item> _
Where (item.<Quantity>.Value * _
       item.<USPrice>.Value) > 100 _
Order By item.<PartNumber>.Value _
Select item

Na C#, isso pode ser regravado no formulário de sintaxe do método:

IEnumerable<XElement> pricesByPartNos = purchaseOrder.Descendants("Item")
                                        .Where(item => (int)item.Element("Quantity") * (decimal)item.Element("USPrice") > 100)
                                        .OrderBy(order => order.Element("PartNumber"));

Além desses recursos de LINQ, o LINQ to XML oferece uma interface de programação XML aprimorada. Usando o LINQ to XML, você pode:

  • Carregar XML de arquivos ou fluxos.
  • Serializar o XML em arquivos ou fluxos.
  • Crie XML a partir do zero usando a construção funcional.
  • Consultar o XML usando eixos do tipo XPath.
  • Manipular a árvore XML na memória usando métodos como Add, Remove, ReplaceWith e SetValue.
  • Validar árvores XML usando XSD.
  • Usar uma combinação desses recursos para transformar árvores XML de uma forma em outra.

Criar árvores XML

Uma das vantagens mais significativas da programação com o LINQ to XML é que é fácil criar árvores XML. Por exemplo, para criar uma árvore XML pequena, você pode escrever código da seguinte forma:

XElement contacts =
new XElement("Contacts",
    new XElement("Contact",
        new XElement("Name", "Patrick Hines"),
        new XElement("Phone", "206-555-0144",
            new XAttribute("Type", "Home")),
        new XElement("phone", "425-555-0145",
            new XAttribute("Type", "Work")),
        new XElement("Address",
            new XElement("Street1", "123 Main St"),
            new XElement("City", "Mercer Island"),
            new XElement("State", "WA"),
            new XElement("Postal", "68042")
        )
    )
);
Dim contacts As XElement = _
    <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>

Observação

A versão do Visual Basic do exemplo usa literais do XML. Você também pode usar XElement no Visual Basic, como na versão C#.

Para obter mais informações, confira árvores XML.

Confira também