У меня есть небольшая служба 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 действителен, и пользователи скоро обнаружат, что он не отображается правильно в другой системе - они все равно загружали его вручную :)