Compartir a través de


Cargar información del esquema de un conjunto de datos desde XML

El esquema de un DataSet (sus tablas, columnas, relaciones y restricciones) se puede definir mediante programación, crear mediante los métodos Fill o FillSchema de un DataAdapter o cargar desde un documento XML. Para cargar información de esquema de un DataSet desde un documento XML puede utilizar el método ReadXmlSchema o InferXmlSchema del DataSet. ReadXmlSchema permite cargar o deducir la información de esquema de un DataSet desde el documento que contiene el esquema de lenguaje de definición de esquema XML (XSD) o desde un documento XML con un esquema XML alineado. InferXmlSchema le permite deducir el esquema a partir del documento XML y pasar por alto ciertos espacios de nombres XML que especifique.

Nota

Es posible que el orden de las tablas de un objeto DataSet no se conserve si usa servicios web o serialización XML para transferir un objeto DataSet creado en memoria mediante construcciones XSD (como las relaciones anidadas). Por tanto, en este caso el destinatario del objeto DataSet no debe depender del orden de las tablas. Sin embargo, el orden de las tablas siempre se mantiene si el esquema del objeto DataSet que se transfiere se recupera de archivos XSD, en lugar de crearse en memoria.

ReadXmlSchema

Para cargar el esquema de un DataSet desde un documento XML sin cargar ningún dato, puede utilizar el método ReadXmlSchema del DataSet. ReadXmlSchema crea el esquema del DataSet definido mediante el esquema del lenguaje de definición de esquemas XML (XSD).

El método ReadXmlSchema toma un argumento único, que puede ser un nombre de archivo, una secuencia o un XmlReader que contiene el documento XML que se va a cargar. El documento XML puede contener únicamente el esquema o puede contener el esquema alineado con elementos XML que contienen datos. 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).

Si el documento XML pasado a ReadXmlSchema no contiene información de esquema alineado, ReadXmlSchema deducirá el esquema a partir de los elementos del documento XML. Si el objeto DataSet ya contiene un esquema, se agregarán tablas nuevas si no existen ya para extender el esquema actual. En las tablas existentes no se agregarán nuevas columnas. Si una columna que se va a agregar ya existe en el DataSet, pero tiene un tipo incompatible con la columna encontrada en el código XML, se generará una excepción. 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.

Mientras que ReadXmlSchema carga o deduce únicamente el esquema de un DataSet, el método ReadXml del DataSet carga o deduce el esquema y los datos contenidos en el documento XML. Para más información, consulte Carga de un conjunto de datos desde XML.

En los ejemplos de código siguientes, se muestra cómo cargar el esquema de un DataSet desde una secuencia o un documento XML. En el primer ejemplo, se muestra cómo se pasa un nombre de archivo de esquema XML al método ReadXmlSchema. En el segundo ejemplo, se muestra un objeto System.IO.StreamReader.

Dim dataSet As DataSet = New DataSet  
dataSet.ReadXmlSchema("schema.xsd")  
DataSet dataSet = new DataSet();  
dataSet.ReadXmlSchema("schema.xsd");  
Dim xmlStream As New System.IO.StreamReader("schema.xsd")
Dim dataSet As DataSet = New DataSet  
dataSet.ReadXmlSchema(xmlStream)  
xmlStream.Close()  
System.IO.StreamReader xmlStream = new System.IO.StreamReader("schema.xsd");  
DataSet dataSet = new DataSet();  
dataSet.ReadXmlSchema(xmlStream);  
xmlStream.Close();  

InferXmlSchema

También puede indicar al DataSet que deduzca su esquema a partir de un documento XML mediante el método InferXmlSchema del DataSet. InferXmlSchema funciona del mismo modo que ReadXml con un XmlReadMode de InferSchema (carga datos y deduce el esquema) y ReadXmlSchema si el documento que se lee no contiene ningún esquema alineado. Sin embargo, InferXmlSchema ofrece la posibilidad adicional de especificar que se pasen por alto determinados espacios de nombres XML cuando se deduzca el esquema. InferXmlSchema acepta dos argumentos necesarios: la ubicación del documento XML (especificada por un nombre de archivo, una secuencia o un XmlReader) y una matriz de cadena de espacios de nombres XML que la operación debe pasar por alto.

Por ejemplo, tomemos el siguiente código XML:

<NewDataSet xmlns:od="urn:schemas-microsoft-com:officedata">  
<Categories>  
  <CategoryID od:adotype="3">1</CategoryID>
  <CategoryName od:maxLength="15" od:adotype="130">Beverages</CategoryName>
  <Description od:adotype="203">Soft drinks and teas</Description>
</Categories>  
<Products>  
  <ProductID od:adotype="20">1</ProductID>
  <ReorderLevel od:adotype="3">10</ReorderLevel>
  <Discontinued od:adotype="11">0</Discontinued>
</Products>  
</NewDataSet>  

Debido a los atributos especificados para los elementos en el documento XML anterior, tanto el método ReadXmlSchema como el método ReadXml con un XmlReadMode de InferSchema crean tablas para todos los elementos del documento: Categories, CategoryID, CategoryName, Description, Products, ProductID, ReorderLevel y Discontinued. (Para más información, consulte Inferencia de una estructura relacional de un conjunto de datos a partir de XML). Sin embargo, una estructura más adecuada consistiría en crear únicamente las tablas Categories y Products y, a continuación, crea las columnas CategoryID, CategoryName y Description en la tabla Categories y las columnas ProductID, ReorderLevel y Discontinued en la tabla Products. Para asegurarse de que el esquema deducido pasa por alto los atributos especificados en los elementos XML, utilice el método InferXmlSchema y especifique que se debe pasar por alto el espacio de nombres XML para officedata, como se muestra en el ejemplo siguiente.

Dim dataSet As DataSet = New DataSet  
dataSet.InferXmlSchema("input_od.xml", New String() {"urn:schemas-microsoft-com:officedata"})  
DataSet dataSet = new DataSet();  
dataSet.InferXmlSchema("input_od.xml", new string[] "urn:schemas-microsoft-com:officedata");  

Vea también