2012-04-01 17 views
6

Estoy trabajando con varios objetos XElement para proporcionar algunos datos especificados por el usuario para varios objetos en mi biblioteca. Estoy tratando de evitar especificar la estructura de todo el archivo XML porque a la biblioteca no le debe importar cómo se ve el XML completo, siempre y cuando los elementos específicos que necesita estén estructurados correctamente.Validación de esquema XML de XElement

Para este fin, tengo 3 archivos separados XSD que definen el esquema para cada una de las 3 XElements necesidades de mi clase, sin embargo, tengo algunos problemas para validar el XElement con el esquema. No parece haber un método para hacerlo sin una solución alternativa.

Desde la página MSDN, el método de extensión XElement.Validate() parece estar orientado a la validación de los subelementos de un archivo más grande. El argumento XmlSchemaObject está causando mis problemas ya que no puedo suponer que estará presente en ninguno de los XElements. Creo que puedo evitar este problema al tomar el XmlSchemaElement de mi XmlSchemaSet para pasarlo como el argumento XmlSchemaObject, pero como el XmlSchemaSet ya define todo, parece extraño tener que hacer eso.

¿Existe una mejor opción para validar un XElement con un esquema sin validar primero el XDocument completo?

¿O debería dejar que la capa empresarial maneje la validación del esquema en la aplicación y dejar que la biblioteca asuma que el XElement está formado correctamente (consideré esta opción, pero como preferencia personal prefiero evitar lanzar excepciones y prefiero simplemente dejar el método de llamada sabe que el XElement no es válido a través de un parámetro de retorno).

Respuesta

9

Entiendo el problema que tiene con la API provista, por lo que yo veo tiene dos opciones, una es poner su XElement en un XDocument con p. Ej. XDocument doc = new XDocument(xElementToValidate); y luego llamar al the Validate method on that XDocument donde todo lo que tiene que pasar es XmlSchemaSet, la segunda opción es la forma en que se describe, es decir, utilizar el método Validate del XElement, asegurándose de pasar el XmlSchemaSet y la definición del elemento raíz en ese esquema establecido como XmlSchemaObject. Si se trata de esquemas simples con solo una definición de elemento de nivel superior, todo lo que tiene que hacer es, p.

XmlSchemaSet schemaSet = new XmlSchemaSet(); 
    schemaSet.Add(null, "schema.xsd"); 
    schemaSet.Compile(); 

    XmlSchemaObject schemaObject = schemaSet.GlobalElements.Values.OfType<XmlSchemaObject>().First(); 

Si envuelve uno de los dos enfoques en un método, entonces no debería haber ningún esfuerzo más de llamar a un método igualmente conveniente en el marco .NET podría haber suministrado.

+0

No tengo idea de por qué no pensé en incluir el código en mi propio método de extensión 'XElement.Validate()'. Parece tan lógico ahora que lo dices. Crear una 'XDocument' es otra buena idea que debería haber ocurrido también a mí (pasé demasiado tiempo tratando de descubrir cómo convertirla, y me perdí la solución obvia). Voy a experimentar con ambos y ver cuál prefiero. – psubsee2003

Cuestiones relacionadas