правильный подход к обработке плохих данных XML - PullRequest
2 голосов
/ 30 октября 2008

У меня есть небольшая служба Windows C #, которая периодически извлекает XML из веб-службы и сохраняет данные в таблице базы данных.

К сожалению, это происходит сбой, потому что веб-сервис иногда содержит неверные данные - строки вместо десятичных. У меня нет никакого контроля над веб-службой (неподтвержденный пользовательский ввод из программного обеспечения, которое мы не можем изменить), но я бы хотел записывать неверные данные, чтобы их можно было повторно вводить.

Это простые данные, которые выглядят примерно так:

<ROWS>
  <ROW>
    <COL1>5405</COL1>
    <COL2>102.24</COL1>
  </ROW>
  <ROW>
    <COL1>5406</COL1>
    <COL2>2.25</COL1>
  </ROW>
</ROWS>

В таблице только два столбца: COL1 (NUMBER, 10), COL2 (NUMBER, 10,2).

Я использовал проверяющий XmlReader и этот XSD:

 <?xml version="1.0" encoding="utf-8"?>
    <xs:schema id="ROWS" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
      <xs:element name="ROWS" msdata:IsDataSet="true" msdata:Locale="en-US">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="ROW">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="COL1" type="xs:decimal" minOccurs="0" />
                  <xs:element name="COL2" type="xs:decimal" minOccurs="0" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:choice>
        </xs:complexType>
      </xs:element>
    </xs:schema>

затем набор данных.ReadXml () и Update () в наборе данных.

Всякий раз, когда он обнаруживает неверные данные, я получаю следующее исключение:

System.Xml.Schema.XmlSchemaValidationException был необработан

Сообщение = "COL1" элемент недействителен - значение 'A40' неверен в соответствии с его типом данных «http://www.w3.org/2001/XMLSchema:decimal' - Строка 'A40' не является допустимым десятичным значением. "

Я могу придумать несколько способов обойти проблему, но все они кажутся чем-то вроде клочья, и я хотел бы изучить что-то более изящное и улучшить свои знания. Вот что я придумала до сих пор:

  • Предварительно обработайте XML, предоставленный веб-службой, перед загрузкой в ​​проверяющее средство чтения XML, полностью удалив все поврежденные узлы.
  • Перехват исключений XmlSchemaValidationException и попытайтесь изящно продолжить их (не уверен насчет этого)
  • Не используйте проверяющий XML-ридер, а вместо этого перехватывайте исключения при загрузке неподтвержденного XML в набор данных. (опять не уверен насчет этого)
  • содержит строковые столбцы в наборе данных и игнорирует неверные данные до тех пор, пока я не обновлю их, и не уловим все, что база данных отклоняет.
  • идите и стойте над пользователями с большим молотком, пока они не научатся делать это правильно с первого раза (слишком много времени)
  • что-то еще?

ОБНОВЛЕНИЕ: Данные могут быть неверными, потому что они получены из приложения, которое не проверяет пользовательский ввод для COL1 - но числа в COL2 рассчитаны правильно, и COL1 должен соответствовать другой системе , Любые недействительные записи должны быть записаны, чтобы их можно было исправить. После того, как данные записаны в базу данных, другая система проверяет, что COL1 действителен, и пользователи скоро обнаружат, что он не отображается правильно в другой системе - они все равно загружали его вручную :)

Ответы [ 3 ]

3 голосов
/ 30 октября 2008

Предварительная обработка XML, предоставленного веб-сервис перед загрузкой в проверка читателя XML, удаление любого плохие узлы целиком.

Это вариант, который я бы выбрал, он позволит вам захватить неверный ввод перед исключением и сохранить его где-нибудь, чтобы его можно было просмотреть позже. Затем вы можете найти оскорбительного пользователя и использовать другой из ваших методов

иди и стой над пользователями с большой молоток, пока они не научатся получать это правильно первый раз

0 голосов
/ 30 октября 2008

Если бы это только случайно, я бы, вероятно, кешировал последний известный хороший результат и вообще игнорировал бы все плохие фиды. (Возможно, запишите предупреждение.) Я постараюсь не пытаться исправить неправильный канал. Если это даже не соответствует схеме, кто скажет, что фактические данные верны.

Кроме того, вы обязательно должны поднять проблему с поставщиком каналов, чтобы попытаться заставить его устранить проблему.

0 голосов
/ 30 октября 2008

Вопрос для меня: что вы хотите сделать с данными erroneus? Вы хотите проигнорировать это, продезинфицировать (удалить «А» из «А40») или собрать его, чтобы однажды, наконец, показать его пользователям (говоря о большом молотке ;-)?

Если вы просто хотите пропустить строки с неверными данными, удалите те, у которых есть ошибки, прежде чем делать что-либо еще. Вы должны решить сами, если вам все еще нужно проверить оставшийся XML перед вводом его в базу данных. Если вы проводите зачистку ограничительным образом, это больше не нужно.

...