Problema ao ler o arquivo XML em C# DataSet
Pergunta
Recebi um arquivo .xml que precisava ler em meu código como um DataSet (como plano de fundo, o arquivo foi criado criando um DataSet
em C# e chamando dataSet.WriteXml(file, XmlWriteMode.IgnoreSchema)
, mas isso foi feito por outra pessoa).
O arquivo .xml tinha o seguinte formato:
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<Foo>
<Bar>abcd</Bar>
<Foo>efg</Foo>
</Foo>
<Foo>
<Bar>hijk</Bar>
<Foo>lmn</Foo>
</Foo>
</NewDataSet>
Usando C# e .NET 2.0, li o arquivo usando o código abaixo:
DataSet ds = new DataSet();
ds.ReadXml(file);
Usando um ponto de interrupção, depois disso line ds.Tables[0]
ficou assim (usando traços no lugar de sublinhados que não consegui formatar corretamente):
Bar Foo-Id Foo-Id-0
abcd 0 null
null 1 0
hijk 2 null
null 3 2
Encontrei uma solução alternativa (sei que existem muitas) e consegui ler com sucesso o .xml, mas gostaria de entender o porquê ds.ReadXml(file)
realizado dessa maneira, então poderei evitar o problema no futuro.Obrigado.
Solução
Isso parece estar correto para o seu aninhado Tags foo:
<NewDataSet>
<Foo> <!-- Foo-Id: 0 -->
<Bar>abcd</Bar>
<Foo>efg</Foo> <!-- Foo-Id: 1, Parent-Id: 0 -->
</Foo>
<Foo> <!-- Foo-Id: 2 -->
<Bar>hijk</Bar>
<Foo>lmn</Foo> <!-- Foo-Id: 3, Parent-Id: 2 -->
</Foo>
</NewDataSet>
Portanto, isso se torna corretamente 4 registros no seu resultado, com uma chave pai-filho de "Foo-Id-0"
Tentar:
<NewDataSet>
<Rec> <!-- Rec-Id: 0 -->
<Bar>abcd</Bar>
<Foo>efg</Foo>
</Rec>
<Rec> <!-- Rec-Id: 1 -->
<Bar>hijk</Bar>
<Foo>lmn</Foo>
</Rec>
</NewDataSet>
O que deve resultar em:
Bar Foo Rec-Id
abcd efg 0
hijk lmn 1
Outras dicas
Estas são minhas observações, em vez de uma resposta completa:
Meu palpite (sem tentar reproduzi-lo sozinho) é que algumas coisas podem estar acontecendo enquanto o DataSet tenta 'achatar' uma estrutura hierárquica em uma estrutura de dados relacional.
1) pensar os dados a partir de uma perspectiva de banco de dados relacional;não há nenhum campo de chave primária óbvio para identificar cada um dos elementos Foo na coleção, portanto o DataSet usou automaticamente a posição ordinal no arquivo como um campo gerado automaticamente chamado Foo-Id.
2) Na verdade, existem dois elementos chamados 'Foo', o que provavelmente explica a geração de um nome estranho para a coluna 'Foo-Id-0' (gerou automaticamente um nome exclusivo para a coluna - acho que você poderia pensar em isso como um comportamento tolerante a falhas no DataSet).