Pregunta

Estoy usando archivos XSD para validar archivos XML. En los archivos XSD, solo se requieren algunos de los elementos y el resto son opcionales. Sin embargo, es secuencial, por lo que el orden de los elementos tal como aparecen en los lotes de materia de datos. Después de considerar algunos escenarios que el usuario puede encontrar, se me ocurrió un caso que tengo un pequeño problema para resolverlo.

El caso es este: por ejemplo, hay 6 elementos A, B, C, D, E, F en el archivo XSD. Solo se necesitan A, C y D. El usuario comienza con A, C, D. Permito que el usuario agregue una columna, con el nombre B. Sin embargo, se adjunta en el final: A, C, D, B. Por lo tanto, ya que es secuencial, lo hará. no validar.

Entonces, mi pregunta es, ¿cómo inserto B entre A y C para que pase la validación XSD? ¿O hay alguna otra forma de reordenar las cosas en DataGridView y reflejar eso en el DataTable?

Pensé que podría resolver el problema al permitir que el usuario reordene las columnas en DataGridView donde se muestra la tabla.

EDITAR: Según el supuesto de que no puedo alterar los archivos XSD.

Eso es,

    dataGridView1.AllowUserToOrderColumns = true;

Sin embargo, la validación siempre me decía que se esperaba un "elemento" después del último elemento necesario. Esto significa que el cambio en la DataColumn en DataGridView no se reflejó en el DataTable en sí.

Para aprobar la validación, creo que necesitaría insertar la columna en el lugar respectivo, es relativo a todo lo demás. O al menos inserte al final y refleje el orden adecuado cuando el usuario presione el botón Validar.

Me he encontrado con otras cosas en línea diciéndome que pruebe cosas como:

    Table.Columns["Column Name"].SetOrdinal(NewIndex);

Pero aún no lo he implementado. ¿Alguna idea en caso de que esa línea anterior no funcione? =) Además, quiero poder sincronizar el DataTable con lo que el usuario hace en DataGridView. Eso sería ideal. Si el usuario mueve las columnas en DataGridView, el DataTable debe reflejar ese cambio.

Cualquier idea es muy apreciada, estaré encantado de ofrecer información adicional si es necesario. ¡Gracias!

Sinceramente, tf.rz

(.NET 3.5 SP1, Visual Studio C# 2008)

¿Fue útil?

Solución

¿No tendría más sentido para no ¿Requiere que el usuario ingrese los datos en orden de esquema y, en cambio, haga que el sistema determine automáticamente el orden apropiado en función del esquema? Parece que su (s) esquema (s) serán de construcción similar dadas sus suposiciones, por lo que determinar el orden del esquema no debería ser difícil.

Por ejemplo, podrías dejar el DataTable Como es, coincidir con la entrada del usuario, con columnas en cualquier orden arbitrario. Cuando necesite emitir los datos a XML, examine el archivo de esquema e identifique la secuencia de elementos que deben ser emitidos. Iterar sobre la lista de elementos y la salida de columnas coincidentes de su DataTable como se encuentran.

Para procesar el archivo de esquema y descubrir la secuencia, puede usar System.Xml.Schema.XmlSchema, o, como el esquema es en sí mismo XML, puede consultar el XML directamente usando XmlDocument, XPath, XDocument etc.

Otros consejos

No has dado tu XSD, pero supongo que estás usando

 <xs:sequence>.

En su lugar, use

 <xs:all>

p.ej

 <xs:element name="person">
  <xs:complexType>
   <xs:all minOccurs="0">
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    </xs:all>
  </xs:complexType>
 </xs:element>

¡El ejemplo anterior indica que los elementos "FirstName" y los "LastName" pueden aparecer en cualquier orden y que cada elemento puede parecer cero o una vez!

Ver http://www.w3schools.com/schema/el_all.asp Para más información.

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