Compartir a través de


Cargar DataSet desde XML (ADO.NET)

Actualización: November 2007

Es posible crear el contenido de un DataSet de ADO.NET a partir de una secuencia o de un documento XML. Además, con .NET Framework se dispone de una gran flexibilidad sobre qué información se carga desde XML y cómo se crea el esquema o la estructura relacional del DataSet.

Para rellenar un DataSet con datos XML, utilice el método ReadXml del objeto DataSet. El método ReadXml lee desde un archivo, una secuencia o un XmlReader y toma como argumentos el origen de XML y un argumento XmlReadMode opcional. Para obtener más información sobre el XmlReader, vea Leer datos XML con XmlTextReader. El método ReadXml lee el contenido de la secuencia o el documento XML y carga datos en el DataSet. También crea el esquema relacional del DataSet dependiendo del XmlReadMode especificado y de si ya existe o no un esquema relacional.

En la tabla siguiente se describen las opciones para el argumento XmlReadMode.

Opción

Descripción

Automático

Éste es el valor predeterminado. Examina el código XML y elige la opción más apropiada, en el orden siguiente:

  • Si el código XML es un DiffGram, se utiliza DiffGram.

  • Si el DataSet contiene un esquema o el código XML contiene un esquema en línea, se utiliza ReadSchema.

  • Si el DataSet no contiene un esquema y el código XML no contiene un esquema en línea, se utiliza InferSchema.

Si conoce el formato del código XML que se está leyendo, para mejorar el rendimiento se recomienda establecer un XmlReadMode explícito en lugar de permitir el uso del valor predeterminado Auto.

ReadSchema

Lee cualquier esquema en línea y carga los datos y el esquema.

Si el DataSet ya contiene un esquema, se agregan nuevas tablas del esquema en línea al esquema existente en el DataSet. Si ya existe alguna tabla del esquema en línea en el DataSet, se iniciará una excepción. No podrá modificar el esquema de una tabla existente mediante XmlReadMode.ReadSchema.

Si el DataSet no contiene un esquema y no hay ningún esquema en línea, no se leerá ningún dato.

Es posible definir el esquema en línea mediante el esquema del lenguaje de definición de esquemas XML (XSD). Para obtener información detallada sobre cómo escribir esquemas en línea como esquema XML , vea Derivar la estructura relacional de DataSet desde la definición de esquema XML (XSD).

IgnoreSchema

Pasa por alto cualquier esquema en línea y carga los datos en el esquema del DataSet existente. Se descartan todos los datos que no coincidan con el esquema existente. Si no existe ningún esquema en el DataSet, no se cargará ningún dato.

Si los datos son un DiffGram, IgnoreSchema tiene la misma funcionalidad que DiffGram.

InferSchema

Pasa por alto cualquier esquema en línea, deduce el esquema por la estructura de los datos XML y, a continuación, carga los datos.

Si el DataSet ya contiene un esquema, se extiende el esquema actual mediante la adición de columnas a las tablas existentes. Si no existen tablas, no se agregarán tablas adicionales. Se iniciará una excepción si ya existe una tabla inferida con un espacio de nombres diferente o si alguna columna inferida entra en conflicto con columnas existentes.

Para obtener información detallada sobre cómo ReadXmlSchema deduce un esquema a partir de un documento XML, vea Deducir la estructura relacional de DataSet de XML (ADO.NET).

DiffGram

Lee un DiffGram y agrega los datos al esquema actual. DiffGram combina las filas nuevas con las filas existentes en las que coinciden los valores de identificador. Vea "Combinar datos desde XML" al final de este tema. Para obtener más información sobre DiffGrams, vea DiffGrams (ADO.NET).

Fragmento

Sigue leyendo varios fragmentos de XML hasta llegar al final de la secuencia. Los fragmentos que coinciden con el esquema del DataSet se anexan a las tablas apropiadas. Los fragmentos que no coinciden con el esquema del DataSet se descartan.

Nota:

Si pasa un XmlReader a un ReadXml que se encuentra en medio de un documento XML, ReadXml leerá hasta el siguiente nodo de elemento y lo considerará un elemento raíz, leyendo hasta el final del nodo de elemento únicamente. Esto no se aplica si especifica XmlReadMode.Fragment.

Entidades DTD

Si el código XML contiene entidades definidas en un esquema de definición de tipo de documento (DTD), se iniciará una excepción si intenta cargar un DataSet pasando a ReadXml un nombre de archivo, una secuencia o un XmlReader sin validación. En su lugar, debe crear un XmlValidatingReader, donde EntityHandling tenga el valor EntityHandling.ExpandEntities, y pasar el XmlValidatingReader a ReadXml. El XmlValidatingReader expandirá las entidades antes de que las lea el DataSet.

En los siguientes ejemplos de código se muestra cómo cargar un DataSet desde una secuencia XML. En el primer ejemplo se muestra un nombre de archivo que se pasa al método ReadXml. En el segundo ejemplo se muestra una cadena que contiene el código XML que se carga mediante un StringReader.

Dim dataSet As DataSet = New DataSet
dataSet.ReadXml("input.xml", XmlReadMode.ReadSchema)
DataSet dataSet = new DataSet();
dataSet.ReadXml("input.xml", XmlReadMode.ReadSchema);
Dim dataSet As DataSet = New DataSet
Dim dataTable As DataTable = New DataTable("table1")
dataTable.Columns.Add("col1", Type.GetType("System.String"))
dataSet.Tables.Add(dataTable)

Dim xmlData As String = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>"

Dim xmlSR As System.IO.StringReader = New System.IO.StringReader(xmlData)

dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema)
DataSet dataSet = new DataSet();
DataTable dataTable = new DataTable("table1");
dataTable.Columns.Add("col1", typeof(string));
dataSet.Tables.Add(dataTable);

string xmlData = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>";

System.IO.StringReader xmlSR = new System.IO.StringReader(xmlData);

dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);
Nota:

Si llama a ReadXml para cargar un archivo muy grande, el rendimiento puede resultar muy lento. Para garantizar un rendimiento óptimo de ReadXml (en un archivo de gran tamaño) llame al método BeginLoadData para cada una de las tablas del DataSety, a continuación, llame a ReadXml. Por último, llame a EndLoadData para cada una de las tablas del DataSet, tal y como se muestra en el siguiente ejemplo.

Dim dataTable As DataTable

For Each dataTable In dataSet.Tables
   dataTable.BeginLoadData()
Next

dataSet.ReadXml("file.xml")

For Each dataTable in dataSet.Tables
   dataTable.EndLoadData()
Next
foreach (DataTable dataTable in dataSet.Tables)
   dataTable.BeginLoadData();

dataSet.ReadXml("file.xml"); 

foreach (DataTable dataTable in dataSet.Tables)
   dataTable.EndLoadData();
Nota:

Si el esquema XSD de un DataSet incluye un targetNamespace, no se podrán leer los datos y pueden aparecer excepciones al llamar a ReadXml para cargar el DataSet con XML que contenga elementos con un espacio de nombres sin certificar. En este caso, para leer los elementos no certificados, establezca elementFormDefault en "completo" en el esquema XSD. Por ejemplo:

<xsd:schema id="customDataSet" 
  elementFormDefault="qualified"
  targetNamespace="http://www.tempuri.org/customDataSet.xsd" 
  xmlns="http://www.tempuri.org/customDataSet.xsd" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
</xsd:schema>

Combinar datos a partir de XML

Si el DataSet ya contiene datos, los nuevos datos procedentes del código XML se agregarán a los ya presentes en el DataSet. ReadXml no combina a partir de XML en el DataSet ninguna información de fila que tenga claves principales coincidentes. Si desea sobrescribir información de fila existente con nueva información procedente de XML, utilice ReadXml para crear un nuevoDataSet y, a continuación, realice una operación Merge el nuevo DataSet en el DataSet existente. Hay que tener en cuenta que al cargar un DiffGram mediante un ReadXML cuyo valor de XmlReadMode es DiffGram se combinarán las filas que tengan el mismo identificador único.

Vea también

Conceptos

DiffGrams (ADO.NET)

Cargar la información de esquema de DataSet desde XML (ADO.NET)

Referencia

DataSet.Merge

Otros recursos

Utilizar XML en un DataSet (ADO.NET)

Derivar la estructura relacional de DataSet desde la definición de esquema XML (XSD)

Deducir la estructura relacional de DataSet de XML (ADO.NET)

DataSets, DataTables y DataViews (ADO.NET)