Compartir a través de


Cargar DataSet desde XML

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 desde XML, hay que utilizar el método ReadXml del objeto DataSet. El método ReadXml leerá 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 acerca de 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 creará 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.

XmlReadMode Descripción
Auto É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 alguna tabla del esquema en línea ya existe 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 más detalles sobre cómo escribir un esquema en línea como un esquema XML, vea Generar 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 descartarán 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, después, carga los datos.

Si el DataSet ya contiene un esquema, se extiende el esquema actual; para ello se agregan nuevas tablas donde no existe ninguna tabla o se agregan columnas a las tablas existentes. 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 más detalles sobre cómo ReadXmlSchema deduce un esquema a partir de un documento XML, vea Deducir la estructura relacional de DataSet de XML.

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 la nota sobre "Combinar datos desde XML" al final de este tema. Para obtener más información acerca de los DiffGrams, vea DiffGrams.
Fragment 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 System.IO.StringReader.

Dim myDS As DataSet = New DataSet
myDS.ReadXml("input.xml", XmlReadMode.ReadSchema)
[C#]
DataSet myDS = new DataSet();
myDS.ReadXml("input.xml", XmlReadMode.ReadSchema);
[Visual Basic]
Dim myDS As DataSet = New DataSet
Dim myTable As DataTable = New DataTable("table1")
myTable.Columns.Add("col1", Type.GetType("System.String"))
myDS.Tables.Add(myTable)

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)

myDS.ReadXml(xmlSR, XmlReadMode.IgnoreSchema)
[C#]
DataSet myDS = new DataSet();
DataTable myTable = new DataTable("table1");
myTable.Columns.Add("col1", typeof(string));
myDS.Tables.Add(myTable);

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

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

myDS.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);

Nota   Si llama al método 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 DataTable.BeginLoadData para cada una de las tablas del DataSet y, a continuación, llame a ReadXml. Por último, llame a DataTable.EndLoadData para cada una de las tablas del DataSet tal y como se muestra en el siguiente ejemplo.

Dim t As DataTable

For Each t In ds.Tables
  t.BeginLoadData()
Next

ds.ReadXml("file.xml")

For Each t in ds.Tables
  t.EndLoadData()
Next
[C#]
foreach (DataTable t in ds.Tables)
  t.BeginLoadData();

ds.ReadXml("file.xml"); 

foreach (DataTable t in ds.Tables)
  t.EndLoadData();

Nota   Si el esquema XSD del DataSet incluye un atributo targetNamespace, es posible que no se lean los datos y que se produzcan excepciones al llamar a ReadXml para cargar el DataSet con XML que contenga elementos que no disponen de un espacio de nombres completo. En este caso, para leer los elementos incompletos, establezca elementFormDefault en "completo" en el esquema XSD. Por ejemplo:

<xsd:schema id="MyDataSet" 
  elementFormDefault="qualified"
  targetNamespace="http://www.tempuri.org/MyDataSet.xsd" 
  xmlns="http://www.tempuri.org/MyDataSet.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 se desea sobrescribir información de fila existente con nueva información procedente de XML, utilice ReadXml para crear un nuevo DataSet y, después, combine (con 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

XML y DataSet | DiffGrams | Generar la estructura relacional de DataSet desde la definición de esquema XML (XSD) | Deducir la estructura relacional de DataSet de XML | Cargar la información de esquema de DataSet desde XML | DataSet.Merge (Método) | Crear y utilizar DataSets