2012-02-01 6 views
6

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 ...

  1. cheque si la cadena XML contiene "<ErrorResult>"
  2. intenta convertir XML a clase ErrorResult y compruebe si hay fallar
  3. uso XDocument o similares funciones integradas para analizar el árbol y buscar el nodo ErrorResult

Respuesta

5

Dado que el método es esencialmente GetXml() ret urning sin tipo de datos y la única suposición segura es que se estructura como XML, la forma más segura de hacer valer su tipo real sería la de analizar como XML:

private bool IsError(string xml) 
{ 
    var document = XDocument.Parse(xml); 
    return document.Element("ErrorResult") != null; 
} 
+0

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

+1

[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. –

Cuestiones relacionadas