Compartir a través de


Información general sobre el control de servidor web XmlDataSource

Actualización: noviembre 2007

El control XmlDataSource pone datos XML a disposición de los controles enlazados a datos. Puede utilizarlo para mostrar datos jerárquicos y de tablas, aunque el control XmlDataSource se suele utilizar normalmente para ver datos XML jerárquicos en escenarios de sólo lectura.

Recuperar datos mediante el control XmlDataSource

XmlDataSource carga datos XML de un archivo XML especificado mediante la propiedad DataFile. Los datos XML también se pueden cargar desde una cadena utilizando la propiedad Data.

El control XmlDataSource expone atributos de elementos XML como campos enlazables a datos Si desea enlazar a valores que no son atributos, puede especificar una transformación mediante una hoja de estilos de Lenguaje de hoja de estilos extensible (XSL). En plantillas de controles, como en los controles FormView o GridView, puede enlazar también un control de una plantilla a datos XML mediante la función de enlace a datos XPath. Para obtener información sobre cómo utilizar una expresión XPath, vea Enlazar un control tabular con el control XmlDataSource.

El ejemplo de código siguiente muestra unos controles XmlDataSource y TreeView enlazados a él. El XML de origen se muestra después del ejemplo de código.

<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:XmlDataSource
        id="PeopleDataSource"
        
        DataFile="~/App_Data/people.xml" />

      <asp:TreeView
        id="PeopleTreeView"
        
        DataSourceID="PeopleDataSource">
        <DataBindings>
          <asp:TreeNodeBinding DataMember="LastName"    TextField="#InnerText" />
          <asp:TreeNodeBinding DataMember="FirstName"   TextField="#InnerText" />
          <asp:TreeNodeBinding DataMember="Street"      TextField="#InnerText" />
          <asp:TreeNodeBinding DataMember="City"        TextField="#InnerText" />
          <asp:TreeNodeBinding DataMember="Region"      TextField="#InnerText" />
          <asp:TreeNodeBinding DataMember="ZipCode"     TextField="#InnerText" />
          <asp:TreeNodeBinding DataMember="Title"       TextField="#InnerText" />
          <asp:TreeNodeBinding DataMember="Description" TextField="#InnerText" />
        </DataBindings>
      </asp:TreeView>

    </form>
  </body>
</html>
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:XmlDataSource
        id="PeopleDataSource"
        
        DataFile="~/App_Data/people.xml" />

      <asp:TreeView
        id="PeopleTreeView"
        
        DataSourceID="PeopleDataSource">
        <DataBindings>
          <asp:TreeNodeBinding DataMember="LastName"    TextField="#InnerText" />
          <asp:TreeNodeBinding DataMember="FirstName"   TextField="#InnerText" />
          <asp:TreeNodeBinding DataMember="Street"      TextField="#InnerText" />
          <asp:TreeNodeBinding DataMember="City"        TextField="#InnerText" />
          <asp:TreeNodeBinding DataMember="Region"      TextField="#InnerText" />
          <asp:TreeNodeBinding DataMember="ZipCode"     TextField="#InnerText" />
          <asp:TreeNodeBinding DataMember="Title"       TextField="#InnerText" />
          <asp:TreeNodeBinding DataMember="Description" TextField="#InnerText" />
        </DataBindings>
      </asp:TreeView>

    </form>
  </body>
</html>

A continuación se muestran los datos XML utilizados en el ejemplo de código anterior.

<?xml version="1.0" encoding="utf-8" ?>
<People>
  <Person>
    <Name>
      <FirstName>Manoj</FirstName>
      <LastName>Syamala</LastName>
    </Name>
    <Address>
      <Street>345 Maple St.</Street>
      <City>Redmond</City>
      <Region>WA</Region>
      <ZipCode>01434</ZipCode>
    </Address>
    <Job>
      <Title>CEO</Title>
      <Description>Develops company strategies.</Description>
    </Job>
  </Person>

  <Person>
    <Name>
      <FirstName>Jared</FirstName>
      <LastName>Stivers</LastName>
    </Name>
    <Address>
      <Street>123 Elm St.</Street>
      <City>Seattle</City>
      <Region>WA</Region>
      <ZipCode>11223</ZipCode>
    </Address>
    <Job>
      <Title>Attorney</Title>
      <Description>Reviews legal issues.</Description>
    </Job>
  </Person>

  <Person>
    <Name>
      <FirstName>Karina</FirstName>
      <LastName>Agerby</LastName>
    </Name>
    <Address>
      <Street>34 Palm Avenue</Street>
      <City>Renton</City>
      <Region>WA</Region>
      <ZipCode>63910</ZipCode>
    </Address>
    <Job>
      <Title>IT Director</Title>
      <Description>In charge of corporate network.</Description>
    </Job>
  </Person>
</People>

Transformación de datos XML mediante el control XmlDataSourceControl

Si desea transformar datos XML antes de que los muestre un control enlazado a datos, puede proporcionar una hoja de estilos de Lenguaje de hoja de estilos extensible (XSL) para el control XmlDataSource. Al igual que con datos XML, la hoja de estilos se carga normalmente desde un archivo, que se especifica mediante la propiedad TransformFile. Sin embargo, también se puede cargar directamente la hoja de estilos desde una cadena mediante la propiedad Transform.

Para proporcionar argumentos de hoja de estilos XSLT dinámicos que la hoja de estilos de XSL va a utilizar durante la transformación, puede establecer la propiedad TransformArgumentList.

Nota:

Si especifica una expresión de filtrado XPath mediante la propiedad XPath, el filtro se aplica después de que tenga lugar la transformación.

El ejemplo de código siguiente muestra unos controles XmlDataSource y TreeView enlazados a él. El ejemplo utiliza los datos XML del ejemplo anterior. La hoja de estilos de XSL utilizada en el ejemplo se muestra después del ejemplo de código.

<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:XmlDataSource
        id="PeopleDataSource"
        
        TransformFile="~/App_Data/names.xsl"
        DataFile="~/App_Data/people.xml" />

      <asp:TreeView
        id="PeopleTreeView"
        
        DataSourceID="PeopleDataSource">
        <DataBindings>
          <asp:TreeNodeBinding DataMember="Name"   TextField="#InnerText" />
        </DataBindings>
      </asp:TreeView>

    </form>
  </body>
</html>
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:XmlDataSource
        id="PeopleDataSource"
        
        TransformFile="~/App_Data/names.xsl"
        DataFile="~/App_Data/people.xml" />

      <asp:TreeView
        id="PeopleTreeView"
        
        DataSourceID="PeopleDataSource">
        <DataBindings>
          <asp:TreeNodeBinding DataMember="Name"   TextField="#InnerText" />
        </DataBindings>
      </asp:TreeView>

    </form>
  </body>
</html>

A continuación se muestra la hoja de estilos de XSL utilizada en el ejemplo de código anterior.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="People">
  <Names>
    <xsl:apply-templates select="Person"/>
  </Names>
</xsl:template>

<xsl:template match="Person">
  <xsl:apply-templates select="Name"/>
</xsl:template>

<xsl:template match="Name">
  <name><xsl:value-of select="LastName"/>, <xsl:value-of select="FirstName"/></name>
</xsl:template>

</xsl:stylesheet>

Edición de datos XML mediante el control XmlDataSourceControl

El control XmlDataSource se utiliza normalmente en escenarios de datos de sólo lectura donde un control enlazado a datos muestra datos XML. Sin embargo, también puede utilizar XmlDataSource para editar datos XML. Tenga en cuenta que no funcionarán las operaciones automáticas de actualización, inserción y eliminación que funcionan con otros controles de origen de datos. Debe escribir código personalizado para modificar datos mediante el control XmlDataSource.

Para editar los datos XML, llame al método GetXmlDocument para recuperar un objeto XmlDocument, que es una representación en memoria de los datos XML. Puede utilizar el modelo de objetos expuesto por el objeto XmlDocument y sus objetos XmlNode o puede utilizar una expresión XPath para manipular datos en el documento. Cuando se realicen cambios en la representación en memoria de los datos XML, puede guardar los datos en disco llamando al método Save. Esto sobrescribe el archivo XML del disco en su totalidad.

La lista siguiente indica algunas restricciones en la edición de datos XML mediante el control XmlDataSource:

  • Los datos XML deben cargarse desde un archivo XML especificado con la propiedad DataFile y no desde una cadena de XML especificada en la propiedad Data.

  • No se puede especificar ninguna transformación de XSLT en las propiedades Transform o TransformFile.

  • El método Save no controla operaciones de guardado simultáneas mediante solicitudes diferentes. Si hay más de un usuario editando un archivo XML mediante el control XmlDataSource, no hay garantías de que todos los usuarios estén operando con los mismos datos ni tampoco de que un usuario no sobrescriba los cambios de otro usuario. También es posible que falle una operación Save porque otro usuario esté escribiendo en el archivo XML y tiene un bloqueo exclusivo del archivo.

Filtrado de datos XML mediante el control XmlDataSource

De manera predeterminada, el control XmlDataSource expone todos los datos XML especificados por las propiedades DataFile o Data. Sin embargo, puede filtrar los datos mediante una expresión XPath. La propiedad XPath permite especificar una expresión de filtro XPath que se aplica después de cargar datos XML y de que se les haya aplicado alguna transformación. Para obtener un ejemplo, vea Filtrar datos mediante el control XmlDataSource.

Almacenamiento en caché de datos XML mediante el control XmlDataSource

El control XmlDataSource se suele utilizar normalmente con un archivo XML, y la apertura y lectura de un archivo XML cada vez que se solicita una página puede afectar al rendimiento de la aplicación. Por lo tanto, el almacenamiento en memoria caché está habilitado de manera predeterminada para el control XmlDataSource. El almacenamiento en memoria caché reduce la carga de procesamiento en el servidor a expensas de la memoria del servidor Web; en la mayoría de los casos es un compromiso aceptable. El control XmlDataSource almacena datos en memoria caché cuando la propiedad EnableCaching se establezca en true, que es la opción predeterminada. Establezca la propiedad CacheDuration en el número de segundos durante los cuales el control debe almacenar datos en la memoria caché. Puede utilizar CacheExpirationPolicy para afinar el comportamiento del almacenamiento en memoria caché del control XmlDataSource.

Nota importante:

Se recomienda establecer la propiedad EnableCaching en false cuando la suplantación del cliente esté habilitada y el archivo de código fuente para el control XmlDataSource se recupere en función de la identidad del cliente. Si el almacenamiento en caché está habilitado, todos los usuarios pueden ver los datos XML almacenados en caché para un único usuario y es posible que se exponga información importante a una fuente no deseada. La suplantación del cliente está habilitada cuando el atributo impersonate del elemento de configuración identity está establecido en true y la identificación anónima está deshabilitada para la aplicación en el servidor Web.

Vea también

Otros recursos

XmlDataSource (Control de servidor Web)