Pregunta

Me dieron un archivo .xml que necesitaba leer en mi código como un conjunto de datos (como fondo, el archivo se creó creando un DataSet en C# y llamando dataSet.WriteXml(file, XmlWriteMode.IgnoreSchema), pero esto lo hizo otra persona).

El archivo .xml tenía la siguiente forma:

 <?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# y .NET 2.0, leí el archivo usando el siguiente código:

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

Usando un punto de interrupción, después de esto line ds.Tables[0] se veía así (usando guiones en lugar de guiones bajos que no pude formatear correctamente):

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

Encontré una solución alternativa (sé que hay muchas) y pude leer correctamente el archivo .xml, pero me gustaría entender por qué. ds.ReadXml(file) realizado de esta manera, así podré evitar el problema en el futuro.Gracias.

¿Fue útil?

Solución

Esto parece ser correcto para su anidado Etiquetas 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>

Entonces esto se convierte correctamente en 4 registros en su resultado, con una clave padre-hijo de "Foo-Id-0"

Intentar:

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

Lo que debería resultar en:

Bar     Foo        Rec-Id
abcd    efg        0
hijk    lmn        1

Otros consejos

Estas son mis observaciones en lugar de una respuesta completa:

Mi conjetura (sin intentar reproducirlo yo mismo) es que pueden estar sucediendo un par de cosas cuando el DataSet intenta "aplanar" una estructura jerárquica a una estructura de datos relacional.

1) pensar en los datos desde una perspectiva de base de datos relacional;No existe un campo de clave principal obvio para identificar cada uno de los elementos 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', lo que probablemente explica la generación de un nombre extraño para la columna 'Foo-Id-0' (ha generado automáticamente un nombre único para la columna; supongo que se podría pensar en esto como un comportamiento tolerante a fallos en el DataSet).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top