2015-03-11 7 views
0

В моей работе мы загружаем файлы excel и сохраняем их в базе данных.
Это в основном поток:
Мы импортируем данные в DataSet из файла Excel, где каждый лист загружается в свой собственный DataTable внутри DataSet. После заполнения DataDet я хочу проверить данные внутри DataSet, скажем, первого DataTable. Я получаю xml из DataTable с помощью метода WriteXml() класса DataTable и загружаю этот xml в XDocument. Затем я использую метод Validate() класса XDocument с предопределенным xsd, который загружается в объект XmlSchemaSet.Определить формат dateTime в xsd

Проблема в том, что данные в excel хранятся в формате, отличном от формата dateTime в xsd.
Мы получаем файлы Excel с столбцами datetime, отформатированными как thie: '12/01/2015 12:44:45 ', тогда как формат dateTime в xsd должен быть таким: ' 2015-01-12T12: 44: 45 '

Возможно ли определить пользовательский формат даты в формате xsd?

Например, вместо '2015-01-12T12: 44: 45', я хотел бы, чтобы это было '12/01/2015 12:44:45', так что мой XML-элемент будет выглядеть как это:

<createDate>12/01/2015 12:44:45>/createDate> 

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

Кроме того, еще один пользовательский XSD формат мне нужно, как это: 378,216.00

Можно ли определить его в свой файл XSD?

Вот этот код, где мы делаем проверку на XML, извлечен из DataTable

public string[] ValidateExcelFromXsdFile(string schemaUri) 
    { 
     _validationErrors.Clear(); 

     var schemas = new XmlSchemaSet(); 
     schemas.Add("", schemaUri); 

     var doc = XDocument.Parse(GetXml(_dataSetFromExcel.Tables[0])); 

     doc.Validate(schemas, (sender, args) => _validationErrors.Add(args.Message)); 

     return _validationErrors.ToArray(); 
    } 
+0

Вы хотите, чтобы код C# сериализовал/экспортировал, чтобы написать этот особый формат dateTimeFormat, не так ли? В этом случае добавьте исходный код. В случае, если я вас неправильно понял, пожалуйста, уточните. –

+0

Нет, прошу прощения, это не то, что я имел в виду. Я импортирую данные в DataSet из файла Excel, где каждый лист загружается в свой собственный DataTable внутри DataSet.После заполнения DataDet я хочу проверить данные внутри DataSet, скажем, первого DataTable. Я получаю xml из DataTable с помощью метода WriteXml() класса DataTable и загружаю этот xml в XDocument. Затем я использую метод Validate() класса XDocument с предопределенным xsd, который загружается в объект XmlSchemaSet. – ashilon

+0

И вот код 'public string [] ValidateExcelFromXsdFile (string schemaUri) { _validationErrors.Clear(); var schemas = new XmlSchemaSet(); schemas.Add ("", schemaUri); var doc = XDocument.Parse (GetXml (_dataSetFromExcel.Tables [0])); doc.Validate (схемы, (отправитель, args) => _validationErrors.Add (args.Message)); return _validationErrors.ToArray(); } ' – ashilon

ответ

-1

проверить этот сайт - у вас есть DateTime типа данных http://www.w3schools.com/schema/schema_dtypes_date.asp

Рекомендует также даты и типов пункт Времени данных позволит вам настроить правило на ваши нужды.

+0

Спасибо Krzysztof, я заметил, что есть шаблон, доступный для xsd. Вы знаете, как его использовать? – ashilon

0

Вы можете определить шаблон для строк в формате 'dd/mm/yyyy hh: mm: ss', используя регулярное выражение, но результирующее значение не будет xs: dateTime и будет проверяться на полную достоверность (високосные годы и т. д.) - это немного кошмар (это можно сделать, но приводит к регулярному выражению, которое составляет около одной мили).

Лучшее решение здесь может привести к шаблону transform-then-validate, где вы предварительно обрабатываете входной документ (в стандартный формат XSD) перед его проверкой. Вы можете даже выполнить некоторую проверку на этапе предварительной обработки, если вы выберете.

Процессор схемы Saxon имеет фазу препроцесса, которая позволяет объявить некоторую перестановку значения до обработки схемы, что именно то, что вам нужно здесь (для обоих случаев использования), но, к сожалению, оно не является стандартным.

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