2013-12-10 1 views
0

У меня есть небольшая проблема и я не могу понять, как ее решить. Я проверяю XDocument на схему и получаю все узлы с ошибкой. Но процесс проверки не идет глубже после обнаружения ошибки.XDocument.Validate, как продолжать проверку после ошибок?

 _document.Validate(_schema, (o, e) => 
     { 
      XElement xEle = null; 
      if (o is XAttribute) 
       xEle = (o as XAttribute).Parent; 
      if (o is XElement) 
       xEle = o as XElement; 
      if (xEle == null) 
      { 
       Debug.WriteLine(o.ToString()); 
       return; 
      } 
      _elemtList.Add(o as XElement); 
     }); 

Моя проблема заключается в следующем, как

<Car> 
<CarName></CarName> 
<CarInteriour> 
    <CarInteriorColor>Red</CarInteriorColor> 
</CarInteriour> 
</Car> 

Допустим, это справедливо. Если я изменить следующее

<Car> 
<CarInteriour> 
    <CarInteriorColor></CarInteriorColor> 
</CarInteriour> 
</Car> 

Вот CarName тег отсутствует, и красный цвет. Я только получу ошибку для CarName, но не цвет Красный. Процесс проверки, похоже, пропускает эту структуру, потому что она обнаружила ошибку. Есть ли способ продолжать проверку, даже если произошла ошибка?

ответ

1

Хорошо, я нашел решение, которое работает для меня, и я даю вам обновление, потому что он работает довольно аккуратно.

Что я делаю сейчас. Я использую foreach для каждого XElement в моем _document.Descendants() и я проверяю каждый элемент. Это находит каждую ошибку в документе несколько раз. Так что я делаю, я проверяю свой список ошибок, если я уже нашел эту ошибку раньше. Мой список ошибок - это список моего собственного контейнера errorcontainer, у которого есть найденный XElement с сообщением об ошибке. Таким образом, я добавляю только новые ошибки в список и показываю эти ошибки в диалоговом окне. Теперь пользователь может выбрать ошибку, и я сразу перейду к ошибке в моем редакторе.

   ErrorContainer errorContainer = new ErrorContainer(xEle, e.Message); 
       if (_errors.Any(error => error.xElement.Equals(errorContainer.xElement) && string.CompareOrdinal(error.errorMessage, errorContainer.errorMessage) == 0)) 
       { 
        return; 
       } 
       _errors.Add(errorContainer); 

Я надеюсь, что это помогает некоторым другим людям, которые нуждаются в помощи по этому вопросу :)

 Смежные вопросы

  • Нет связанных вопросов^_^