2012-02-01 3 views
6

Я вызываю функцию, которая возвращает строку, содержащую данные XML. Как эта функция работает, не важно, но полученный xml может быть различным в зависимости от успеха функции.Проверка XML для ожидаемой структуры

В принципе функция возвращает либо ожидающий XML, либо XML с ошибкой. Ниже приведены основные образцы того, что оба результата может выглядеть ...

На успех:

<SpecificResult> 
    <Something>data</Something> 
</SpecificResult> 

On Error:

<ErrorResult> 
    <ErrorCode>1</ErrorCode> 
    <ErrorMessage>An Error</ErrorMessage> 
</ErrorResult> 

Путь моя система настроена в том, что я могу преобразовать строку xml в класс с простой функцией преобразования, но для этого требуется, чтобы я знал тип класса. При успехе я узнаю, что это SpecificResult, и я могу конвертировать. Но сначала хочу проверить, произошла ли ошибка.

Идеальный конечный результат позволил бы что-то похожее на это ...

string xml = GetXML(); 
if(!IsError(xml)) 
{ 
    //convert to known type and process 
} 

Таким образом, вопрос, что является лучшим способом для реализации функции IsError?

Я думал пару вариантов, но не уверен, если я, как и любой из них на самом деле ...

  1. проверить, если строка содержит XML "<ErrorResult>"
  2. попытаться преобразовать XML в класс ErrorResult и проверить для неудачу
  3. использование XDocument или аналогичные встроенные функции для синтаксического анализа дерева и поиск ErrorResult узла

ответ

5

Поскольку метод GetXml() по существу RET го рения нетипизированным данных и единственное безопасное предположение о том, что он структурирован как XML, самый безопасный способ заявить о его фактический тип должен был бы разобрать его, как XML:

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

Благодаря это выглядит достаточно прочным для меня. Просто чтобы убедиться, что msdn не ясно в документах, неудачная попытка «Parse» по-прежнему вернет XDocument (хотя и пустой) правильно? ... также, продержаться для принятого ответа, будет ждать, если у других есть какие-либо данные;) – musefan

+1

[XDocument.Parse (string)] (http://msdn.microsoft.com/en-us/library/system. xml.linq.xdocument.parse.aspx) фактически [бросает исключение XmlException, если он встречает недействительный XML] (http://msdn.microsoft.com/en-us/library/bb387040.aspx). Тем не менее, это звучит как действительно исключительное условие в этом случае, поэтому вы можете не захотеть обработать это в методе 'IsError (string)', а скорее разрешить исключение распространяться дальше в цепочке вызовов. –