Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O conteúdo de um ADO.NET DataSet pode ser criado a partir de um fluxo ou documento XML. Além disso, com o .NET Framework você tem grande flexibilidade sobre quais informações são carregadas do XML e como o esquema ou a estrutura relacional do DataSet é criado.
Para preencher um DataSet com dados de XML, use o ReadXml método do DataSet objeto. O ReadXml método lê a partir de um ficheiro, um fluxo ou um XmlReader, e toma como argumentos a origem do XML mais um argumento opcional XmlReadMode . Para obter mais informações sobre o XmlReader, consulte Lendo dados XML com XmlTextReader. O ReadXml método lê o conteúdo do fluxo ou documento XML e carrega-o DataSet com os dados. Também criará o esquema relacional de , DataSet dependendo do XmlReadMode especificado e se já existe ou não um esquema relacional.
A tabela seguinte descreve as opções para o XmlReadMode argumento.
| Opção | Descrição |
|---|---|
| Automático | Esta é a predefinição. Examina o XML e escolhe a opção mais apropriada na seguinte ordem: - Se o XML for um DiffGram, DiffGram é usado.- Se o DataSet contiver um esquema ou o XML contiver um esquema inline, ReadSchema é utilizado.- Se o DataSet não contiver um esquema e o XML não contiver um esquema inline, InferSchema for utilizado.Se souber o formato do XML a ser lido, para melhor desempenho recomenda-se definir um XmlReadMode explícito, em vez de aceitar o Auto predefinido. |
| ReadSchema | Lê qualquer esquema embutido e carrega os dados e o esquema. Se o DataSet já contiver um esquema, novas tabelas serão adicionadas do esquema embutido ao esquema existente no DataSet. Se alguma tabela no esquema embutido já existir no DataSet, uma exceção será lançada. Você não poderá modificar o esquema de uma tabela existente usando XmlReadMode.ReadSchema. Se o DataSet não contiver um esquema e não houver um esquema embutido, nenhum dado será lido. O esquema embutido pode ser definido usando o esquema XSD (XML Schema Definition Language). Para obter detalhes sobre como escrever esquema embutido como esquema XML, consulte Derivando a estrutura relacional do conjunto de dados do esquema XML (XSD). |
| IgnoreSchema | Ignora qualquer esquema embutido e carrega os dados no esquema existente DataSet . Todos os dados que não corresponderem ao esquema existente serão descartados. Se nenhum esquema existir no DataSet, nenhum dado será carregado. Se os dados forem um DiffGram, IgnoreSchema tem a mesma funcionalidade que DiffGram. |
| InferSchema | Ignora qualquer esquema embutido e infere o esquema de acordo com a estrutura dos dados XML e, em seguida, carrega os dados. Se o DataSet já contiver um esquema, o esquema atual será estendido adicionando colunas às tabelas existentes. Tabelas extras não serão adicionadas se não houver tabelas existentes. Uma exceção será lançada se uma tabela inferida já existir com um namespace diferente ou se alguma coluna inferida entrar em conflito com colunas existentes. Para detalhes sobre como ReadXmlSchema infere um esquema a partir de um documento XML, veja Inferindo Estrutura Relacional de DataSet a partir de XML. |
| DiffGram | Lê um DiffGram e adiciona os dados ao esquema atual.
DiffGram funde novas linhas com linhas existentes onde os valores únicos do identificador coincidem. Consulte "Mesclando dados de XML" no final deste tópico. Para obter mais informações sobre DiffGrams, consulte DiffGrams. |
| Fragmento | Continua lendo vários fragmentos XML até que o final do fluxo seja alcançado. Os fragmentos que correspondem ao DataSet esquema são anexados às tabelas apropriadas. Os fragmentos que não correspondem ao DataSet esquema são descartados. |
Nota
Se passar um XmlReader para ReadXml que esteja posicionado parcialmente num documento XML, ReadXml lerá até o próximo nó de elemento e tratará esse nó como o elemento raiz, prosseguindo apenas até ao fim desse nó de elemento. Isso não se aplica se você especificar XmlReadMode.Fragment.
Entidades DTD
Se o seu XML contiver entidades definidas num esquema de definição de tipo de documento (DTD), será lançada uma exceção se tentar carregar um DataSet nome de ficheiro, fluxo ou XmlReader não validado utilizando o ReadXml. Em vez disso, deve criar um XmlValidatingReader, com EntityHandling definido como EntityHandling.ExpandEntities, e passe o seu XmlValidatingReader para ReadXml. O XmlValidatingReader expandirá as entidades antes de serem lidas pelo DataSet.
Os exemplos de código a seguir mostram como carregar um DataSet de um fluxo XML. O primeiro exemplo mostra um nome de ficheiro a ser passado para o ReadXml método. O segundo exemplo mostra uma cadeia de caracteres que contém XML sendo carregado usando um StringReaderarquivo .
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
Se fizer uma chamada para ReadXml para carregar um ficheiro muito grande, poderá experimentar um desempenho lento. Para garantir o melhor desempenho para ReadXml, em um arquivo grande, chame o BeginLoadData método para cada tabela no e, em seguida, chame DataSetReadXml. Finalmente, chame EndLoadData para cada tabela no DataSet, conforme mostrado no exemplo a seguir.
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
Se o esquema XSD para o seu DataSet incluir um targetNamespace, os dados podem não ser lidos, e pode encontrar exceções ao chamar ReadXml para carregar o DataSet com XML que contém elementos sem um espaço de nomes qualificado. Para ler elementos não qualificados neste caso, defina elementFormDefault igual a "qualificado" no seu esquema XSD. Por exemplo:
<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>
Mesclando dados de XML
Se o DataSet já contiver dados, os novos dados do XML serão adicionados aos dados já presentes no DataSet.
ReadXml não transfere do XML para o DataSet qualquer informação de linha com chaves primárias correspondentes. Para sobrescrever informação de linha existente com novas informações do XML, use ReadXml para criar um novo DataSet, e depois Merge o novo DataSet no existente DataSet. Note que carregar um DiffGram usando ReadXML com um XmlReadMode de DiffGram irá fundir linhas que têm o mesmo identificador único.
Consulte também
- DataSet.Merge
- Usando XML em um DataSet
- DiffGrams
- Derivando a estrutura relacional do conjunto de dados do esquema XML (XSD)
- Inferindo a estrutura relacional do conjunto de dados a partir do XML
- Carregando informações de esquema de conjunto de dados a partir de XML
- DataSets, DataTables e DataViews
- Visão geral ADO.NET