2008-09-09 17 views
6

Me dieron un archivo .xml que necesitaba leer en mi código como un DataSet (como fondo, el archivo se creó creando un DataSet en C# y llamando al dataSet.WriteXml(file, XmlWriteMode.IgnoreSchema), pero esto fue hecho por alguien más).Problema al leer el archivo XML en C# DataSet

El archivo .xml tenía la forma de esto:

<?xml version="1.0" standalone="yes"?> 
<NewDataSet> 
    <Foo> 
    <Bar>abcd</Bar> 
    <Foo>efg</Foo> 
    </Foo> 
    <Foo> 
    <Bar>hijk</Bar> 
    <Foo>lmn</Foo> 
    </Foo> 
</NewDataSet> 

Uso de C# y .NET 2.0, leí el archivo en el uso del código de abajo:

 DataSet ds = new DataSet(); 
     ds.ReadXml(file); 

El uso de un punto de interrupción, después de este line ds.Tables[0] se veía así (con guiones en lugar de subrayados que no podía llegar a formatear correctamente):

Bar  Foo-Id Foo-Id-0 
abcd  0   null 
null  1   0 
hijk  2   null 
null  3   2 

He encontrado una solución alternativa (sé que hay muchas) y he podido leer con éxito en .xml, pero lo que quiero entender es por qué ds.ReadXml(file) se comportó de esta manera, así que podré evitar el problema en el futuro. Gracias.

Respuesta

4

Esto parece ser correcta para sus etiquetas anidadas 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> 

Así que esto se convierte correctamente 4 registros en su resultado, con una llave de padre-hijo de "Foo-Id-0"

Probar:

<NewDataSet> 
    <Rec>    <!-- Rec-Id: 0 --> 
    <Bar>abcd</Bar> 
    <Foo>efg</Foo> 
    </Rec> 
    <Rec>    <!-- Rec-Id: 1 --> 
    <Bar>hijk</Bar> 
    <Foo>lmn</Foo> 
    </Rec> 
</NewDataSet> 

que debería traducirse en:

Bar  Foo  Rec-Id 
abcd efg  0 
hijk lmn  1 
0

Estas son mis observaciones en lugar de una respuesta completa:

Mi conjetura (sin tratar de volver a producir yo mismo) es que un par de cosas que puede estar ocurriendo como el conjunto de datos intenta 'aplanar' una estructura jerárquica a una estructura de datos relacionales.

1) pensando en los datos desde la perspectiva de una base de datos relacional; no hay un campo de clave primario obvio para identificar cada uno de los elementos de Foo en la colección, por lo que el DataSet ha utilizado automáticamente la posición ordinal en el archivo como un campo generado automáticamente llamado Foo-Id.

2) En realidad, hay dos elementos llamados 'Foo' por lo que probablemente explica la generación de un nombre extraño para la columna 'Foo-Id-0' (que tiene un nombre único auto-generado para la columna - Supongo se podría pensar en esto como un comportamiento tolerante a fallas en el DataSet).