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.

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top