Insertar nodos según el orden del XSD

viernes, 26 de septiembre de 2008

Hace poco me tope con un problema insertando nodos en un documento XML (utilizaba el método AppendChild).

Resulta que después de generar el documento lo validaba contra su XSD, y me tope con el problema que generaba los elementos, según el orden de invocaciones al método AppendChild(no de acuerdo a lo que dicta su esquema); por tanto el XML no era válido.

Solución:
Cada nodo tiene información de su esquema y por tanto del elemento en cuestión, solo habría que saber como listar en orden los hijos que lo componen y luego hacer un pequeño algoritmo de inserción.

------------------------------------------
elemento = _doc.CreateElement(elementName);
//se procede a insertar el elemento en la posicion adecuada

//se detecta el orden del nuevo elemento segun su esquema del nodo padre (nodoBase)
XmlSchemaParticle esquemaNodoPadre = ((XmlSchemaComplexType) nodoBase.SchemaInfo.SchemaElement.ElementSchemaType).ContentTypeParticle;
XmlSchemaSequence seqHijos = (XmlSchemaSequence) esquemaNodoPadre;
string[] ordenHijos = new string[seqHijos.Items.Count];
int indice = 0;


foreach(XmlSchemaObject obj in seqHijos.Items){
XmlSchemaElement elem = (XmlSchemaElement) obj;
ordenHijos[indice++] = (elem.Name == null) ? elem.RefName.Name : elem.Name;
}


//se inserta el nuevo nodo en la posicion adecuada
bool insertado = false;
int posicion = 0;
foreach(XmlNode n in nodoBase.ChildNodes){
if(NodoNuevoAnteriorAlActual(ordenHijos, n.Name, elementName)){
nodoBase.InsertBefore(elemento, n);
insertado = true;
break;
}
posicion++;
}


if(!insertado){
nodoBase.AppendChild(elemento);
}
------------------------------------------

Enlaces relacionados:


- FIN -