Información general de LINQ to XML

LINQ to XML proporciona una interfaz de programación XML en memoria que aprovecha .NET Language-Integrated Query (LINQ) Framework. LINQ to XML utiliza las características de .NET y es comparable a una actualizada y rediseñada interfaz de programación XML para el Modelo de objetos de documento (DOM).

XML se ha adoptado ampliamente como un modo de dar formato a datos en diversos contextos. Por ejemplo, puede encontrar XML en la web, en archivos de configuración, en archivos de Microsoft Office Word y en bases de datos.

LINQ to XML es un enfoque actualizado y rediseñado para la programación con XML. Proporciona las funcionalidades de modificación de documentos en memoria del Modelo de objetos de documento (DOM) y es compatible con expresiones de consulta LINQ. Aunque estas expresiones de consulta difieren sintácticamente de XPath, proporcionan una funcionalidad similar.

Desarrolladores de LINQ to XML

LINQ to XML está dirigido a diversos desarrolladores. En el caso de un desarrollador medio que solo quiere realizar una tarea, LINQ to XML simplifica el XML al proporcionar una experiencia de consulta similar a SQL. Con un poco de estudio, los programadores pueden aprender a escribir consultas sucintas y eficaces en el lenguaje de programación que prefieran.

Los desarrolladores profesionales pueden usar LINQ to XML para aumentar considerablemente su productividad. Con LINQ to XML pueden escribir menos código pero más expresivo, compacto y eficaz. Pueden usar expresiones de consulta de distintos dominios de datos simultáneamente.

LINQ to XML es una interfaz de programación XML

LINQ to XML es una interfaz de programación XML en memoria habilitada para LINQ que permite trabajar con XML desde los lenguajes de programación de .NET.

LINQ to XML se parece a Document Object Model (DOM) en lo que respecta a la inserción del documento XML en la memoria. Puede consultar y modificar el documento; una vez modificado, puede guardarlo en un archivo o serializarlo y enviarlo a través de Internet. Pero LINQ to XML difiere de DOM:

  • Proporciona un nuevo modelo de objetos de menor peso y con el que resulta más fácil trabajar.
  • Aprovecha las características de los lenguajes C# y Visual Basic.

La ventaja más importante de LINQ to XML es su integración con Language Integrated Query (LINQ). Esta integración permite escribir consultas en el documento XML en memoria para recuperar colecciones de elementos y atributos. La capacidad de consulta de LINQ to XML es comparable en cuanto a funcionalidad (aunque no en cuanto a sintaxis) con XPath y XQuery. La integración de LINQ en C# y Visual Basic proporciona tipos más fuertes, comprobación en tiempo de compilación y compatibilidad mejorada con el depurador.

Otra ventaja de LINQ to XML es que la capacidad de usar los resultados de consulta como parámetros en constructores de objetos XElement y XAttribute permite un enfoque eficaz para crear árboles XML. Este método, denominado construcción funcional, permite que los desarrolladores transformen fácilmente árboles XML de una forma a otra.

Por ejemplo, podría tener un pedido de compra XML típico, como el que se describe en Archivo XML de ejemplo: pedido de compra típico. Con LINQ to XML podría ejecutar la siguiente consulta para obtener el valor del atributo de número de pieza de cada elemento del pedido 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

En C#, se puede reescribir con formato de sintaxis de método:

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

A modo de ejemplo, imagine que necesita una lista, ordenada por números de pieza, de los elementos con un valor superior a 100 $. Para obtener esta información, podría ejecutar la siguiente 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

Una vez más, en C#, se puede reescribir con formato de sintaxis de método:

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

Además de estas capacidades de LINQ, LINQ to XML proporciona una interfaz de programación XML mejorada. Con LINQ to XML, puede:

  • Cargar XML a partir de archivos o secuencias.
  • Serializar XML a archivos o secuencias.
  • Crear árboles XML desde cero mediante la construcción funcional.
  • Realizar consultas de XML con ejes de tipo XPath.
  • Manipular el árbol XML en memoria con métodos como Add, Remove, ReplaceWith y SetValue.
  • Validar árboles XML mediante XSD.
  • Usar una combinación de estas características para transformar las formas de los árboles XML.

Creación de árboles XML

Una de las ventajas más significativas de la programación con LINQ to XML es la facilidad para crear árboles XML. Por ejemplo, para crear un árbol XML pequeño, puede escribir código de la siguiente manera:

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>

Nota

La versión de Visual Basic del ejemplo usa literales XML. También puede usar XElement en Visual Basic, como en la versión de C#.

Para obtener más información, vea Árboles XML.

Consulte también