Проверка XML на ожидаемую структуру - PullRequest
6 голосов
/ 01 февраля 2012

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

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

В случае успеха:

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

При ошибке:

<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

1 Ответ

5 голосов
/ 01 февраля 2012

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

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