Llamo a una función que devuelve una cadena que contiene datos XML. El funcionamiento de esta función no es importante, pero el xml resultante puede ser diferente según el éxito de la función.Comprobación de XML para la estructura esperada
Básicamente la función devolverá el XML esperado o un XML con formato de error. A continuación se presentan las muestras básicas de lo que los dos resultados pueden parecer ...
En el éxito:
<SpecificResult>
<Something>data</Something>
</SpecificResult>
On Error:
<ErrorResult>
<ErrorCode>1</ErrorCode>
<ErrorMessage>An Error</ErrorMessage>
</ErrorResult>
La forma en que mi sistema está configurado es que puedo convierta una cadena xml en una clase con una función de conversión simple, pero esto requiere que conozca el tipo de clase. En caso de éxito, sabré que es SpecificResult y puedo convertir. Pero quiero verificar primero si ocurrió un error.
El resultado final ideal sería permitir que algo similar a esto ...
string xml = GetXML();
if(!IsError(xml))
{
//convert to known type and process
}
Entonces la pregunta es, ¿cuál es la mejor manera de implementar la función IsError
?
He pensado en un par de opciones, pero no estoy seguro si me gusta ninguno de ellos realmente ...
- cheque si la cadena XML contiene
"<ErrorResult>"
- intenta convertir XML a clase ErrorResult y compruebe si hay fallar
- uso XDocument o similares funciones integradas para analizar el árbol y buscar el nodo ErrorResult
Gracias esto parece lo suficientemente sólido como para mí. Solo para asegurarse de que msdn no estaba claro en los documentos, un intento fallido de 'Parse' devolverá un XDocument (aunque sea uno vacío) ¿correcto? ... también, aguarde la respuesta aceptada, esperará a ver si otros tienen alguna entrada;) – musefan
[XDocument.Parse (string)] (http://msdn.microsoft.com/en-us/library/system. xml.linq.xdocument.parse.aspx) en realidad [arrojará una XmlException si encuentra un XML no válido] (http://msdn.microsoft.com/en-us/library/bb387040.aspx). Sin embargo, eso suena como una condición verdaderamente * excepcional * en este caso, por lo que puede que no desee manejar eso en el método 'IsError (cadena)' sino permitir que la excepción se propague más adelante en la cadena de llamadas. –