Cargar un conjunto de datos 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 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 XmlReader, vea Lectura de 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 Este 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 alineado, se utiliza ReadSchema.
- Si el DataSet no contiene un esquema y el código XML no contiene un esquema alineado, se utiliza InferSchema.

Si conoce el formato del código XML que se está leyendo, para mejorar el rendimiento se recomienda establecer unXmlReadMode explícito en lugar de permitir el uso del valor predeterminado Auto.
ReadSchema Lee cualquier esquema alineado y carga los datos y el esquema.

Si el DataSet ya contiene un esquema, se agregan nuevas tablas del esquema alineado al esquema existente en el DataSet. Si ya existe alguna tabla del esquema alineado 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 alineado, no se leerá ningún dato.

Es posible definir el esquema alineado mediante el esquema del lenguaje de definición de esquemas XML (XSD). Para más información sobre cómo escribir un esquema alineado como esquema XML, consulte Derivación de una estructura relacional de un conjunto de datos a partir de un esquema XML (XSD).
IgnoreSchema Pasa por alto cualquier esquema alineado 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 alineado, 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 detalles sobre cómo ReadXmlSchema deduce un esquema a partir de un documento XML, consulte Inferencia de una estructura relacional de un conjunto de datos a partir 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 "Combinar datos desde XML" al final de este tema. Para obtener más información sobre DiffGrams, vea DiffGrams.
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 DataSet y, 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 calificar. En este caso, para leer los elementos no calificados, 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 nuevo DataSet 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 fusionarán mediante combinación las filas que tengan el mismo identificador único.

Vea también