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
- DataSet.Merge
- Usar XML en un conjunto de datos
- Objetos DiffGram
- Derivar una estructura relacional de un conjunto de datos a partir de un esquema XML (XSD)
- Inferir una estructura relacional de un conjunto de datos a partir de XML
- Cargar información del esquema de un conjunto de datos desde XML
- Objetos DataSet, DataTable y DataView
- Información general de ADO.NET