![]() |
Модераторы: gambit |
![]() ![]() ![]() |
|
crazy_turist |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 15.6.2007 Репутация: нет Всего: нет |
Проверить данных XML документа на соответствие схеме можно с помощью XMLValidationReader,это написано почти в каждом учебнике
![]() DataSet ds; ds.WriteXml("D:\Data\example.xml"); А вот как при этом еще проверить, соответствуют ли данные DataSet конкретной схеме XSD? |
|||
|
||||
tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 11 Всего: 170 |
-------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
crazy_turist |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 15.6.2007 Репутация: нет Всего: нет |
Вы не поняли сути вопроса. схема уже разработана и лежит в конкретном файле "example.xsd".
а вот данные, введенные пользователем в DataSet, могут ей не соответствовать. Вопрос-как перед выгрузкой даных из DataSet в XML проверить соответствуют ли данные DataSet схеме? |
|||
|
||||
thomas |
|
|||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 35 Всего: 65 |
crazy_turist,
Проверять значения вводимые пользователем на валидность. Плюс в UI юзверь должен четко представлять что он вводит и куда (что отнего ожидает это поле ввода).
В ДатаСет создана соответствующая таблица и если данные, которые пользователь хочет туда ввести, не соответствуют типу полей, то уже на этапе записи данных в таблицу выскочит ошибка. Сначала нужно заполнить данными таблицу ДатаСет, а потом уже выгружать данные из ДатаСет в xml файл. -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
|||
|
||||
crazy_turist |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 15.6.2007 Репутация: нет Всего: нет |
В ДатаСет создана соответствующая таблица не "ручками", а примерно так:
StreamReader xsdReader = new StreamReader("D:\\ex.xsd"); XMLDataDocument doc = new XMLDataDocument (); doc.DataSet.ReadXmlSchema(xsdReader); На этом этапе в doc.DataSet созданы таблицы со структурой, указанной в xsd При этом ограничение длины поля в ex.xsd автоматически не переносится на таблицы :( Равно как и другие ограничения, могущие иметь место в xsd, никак не отражаются на созданных таблицах :( Таким образом мы получили DataSet, основанный на схеме, ВСТРОЕННЫМИ средствами NET Далее вопрос-КАК ПРОВЕРИТЬ ДАННЫЕ ВСТРОЕННЫМИ СРЕДСТВАМИ NET? Для этого существует класс XmlValidationReader, но все примеры по его использования сводятся к проверке уже существующего на диске xml-файла!! |
|||
|
||||
thomas |
|
|||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 35 Всего: 65 |
Автоматизация, млин... ![]() А теперь "ручками" послать запрос по мылу разработчикам: "How?". ![]() А если серьезно, то что при наличии схемы таблицы НЕИЗВЕСТНО что там в полях должно быть? Тогда на фига вообще нужны эти схемы. Только названия полей передавать. ![]() -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
|||
|
||||
crazy_turist |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 15.6.2007 Репутация: нет Всего: нет |
А теперь "ручками" послать запрос по мылу разработчикам: "How?".
Ну зачем сразу к разработчикам, когда на форумах много умных людей есть? ![]() Я вам больше доверяю .. иногда ![]() а если по существу, то на данный вопрос How?" ответ мной найден. Выложу его попозже. |
|||
|
||||
thomas |
|
||||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 35 Всего: 65 |
crazy_turist,
Привет. Я тут тоже столкнулся с вопросами XML. Нужно написать приложение которое принимает файл Excel с адресами клиентов, а на выходе должен быть супер навороченный XML. ТАК ЧТО ТВОЙ ОПЫТ мне очень пригодиться. По поводу
В 2005 студии это уже не канает. Устарело. На замену нашел вот это.
Поделись способом проверки . Мне в приложении придется загружать данные из Excel в DataSet, плюс создать DataSet на основе заданного файла xsd, далее полученные данные из Excel записать в нужное место в DataSet'е, созданного по xsd, ПРОВЕРИТЬ что получилось (пригодиться твой способ ![]() -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
||||
|
|||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 8 Всего: 232 |
Да просто всё, на самом деле.
1. читаем XSD-схему в новый пустой датасет (DataSet.ReadXmlSchema) 2. выполняем Merge проверяемого датасета в пустой датасет со схемой 3. если п.2 свалился - значит схема не подходит к датасету -------------------- ![]() |
|||
|
||||
martikan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 2.10.2007 Репутация: нет Всего: нет |
Zdravstvyjte, yvazhaemuje znatoki!
Esli mozhna oyblikyjte kod. S bol'shum yvazheniem, Andrey. |
|||
|
||||
martikan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 2.10.2007 Репутация: нет Всего: нет |
Hi!
Pozhalysta, objasnite, kyda shto posulat'. Kyda posulat' XML iz dataset? Kyada posulat' sxemy? Vot moya sxema: <?xml version="1.0" encoding="utf-8"?> <xs:schema id="FeeSchedule" targetNamespace="http://tempuri.org/FeeSchedule.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/FeeSchedule.xsd" xmlns:mstns="http://tempuri.org/FeeSchedule.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="FeeSchedule" type="FeeScheduleType"/> <xs:simpleType name="ContractIDType"> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="AccountIDType"> <xs:restriction base="xs:string"> <xs:maxLength value="15"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="ProcedureCodeType"> <xs:restriction base="xs:string"> <xs:maxLength value="50"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="RevenueCodeType"> <xs:restriction base="xs:decimal"> <xs:minInclusive value="0"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="ChargeMasterCodeType"> <xs:restriction base="xs:string"> <xs:maxLength value="10"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="RateType"> <xs:restriction base="xs:decimal"> <xs:minInclusive value="0"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="FlatFeeType"> <xs:restriction base="xs:decimal"> <xs:minInclusive value="0"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="PriceCapType"> <xs:restriction base="xs:decimal"> <xs:minInclusive value="0"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="deletedType"> <xs:restriction base="xs:boolean"> </xs:restriction> </xs:simpleType> <xs:complexType name="FeeScheduleType"> <xs:sequence> <xs:element name="ContractID" type="ContractIDType"/> <xs:element name="AccountID" type="AccountIDType"/> <xs:element name="ProcedureCode" type="ProcedureCodeType"/> <xs:element name="RevenueCode" type="RevenueCodeType"/> <xs:element name="ChargeMasterCode" type="ChargeMasterCodeType"/> <xs:element name="Rate" type="RateType"/> <xs:element name="FlatFee" type="FlatFeeType"/> <xs:element name="PriceCap" type="PriceCapType"/> <xs:element name="deleted" type="deletedType"/> </xs:sequence> </xs:complexType> </xs:schema> A vod kod(neponyatnoe mesto vudeleno krasnum): private void ProcessFeeSchedule(string accountID, DataTable feeSchedulesInput, ref DataSet dataDB, ref DataTable errorFeeSchedules) { string functionName = "ProcessFeeSchedule"; logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, "This is time of start of 'ProcessFeeSchedule' function."); string filterFeeSchedule = string.Empty; DataColumn accountIDCol = new DataColumn("AccountID"); accountIDCol.DefaultValue = accountID; feeSchedulesInput.Columns.Add(accountIDCol); DataRow[] feeSchedulesForEditRevenue; DataRow[] feeSchedulesForEditPriceInput; DataTable feeSchedules = new DataTable(); DataTableReader feeSchedulesReader = null; string contractIDTemp = string.Empty; string procedureCodeTemp = string.Empty; string revenueCodeTemp = string.Empty; string chargeMasterCodeTemp = string.Empty; try { if (feeSchedulesInput.Columns["RevenueCodeInput"].DataType.FullName.Equals("System.String")) { logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, "This is time of start of changing 'RevenueCodeInput' column."); filterFeeSchedule = "RevenueCodeInput Like '' or RevenueCodeInput is null"; feeSchedulesForEditRevenue = feeSchedulesInput.Select(filterFeeSchedule); if (feeSchedulesForEditRevenue.Length != 0) { for (int counterRevenueCode = 0; counterRevenueCode < feeSchedulesForEditRevenue.Length; counterRevenueCode++) { feeSchedulesForEditRevenue[counterRevenueCode]["RevenueCodeInput"] = DBNull.Value; } } logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, "This is time of end of changing 'RevenueCodeInput' column."); } if (feeSchedulesInput.Columns["PriceCapInput"].DataType.FullName.Equals("System.String")) { logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, "This is time of start of changing 'PriceCapInput' column."); filterFeeSchedule = "PriceCapInput Like '$*' or PriceCapInput Like '' or PriceCapInput Like '*,*'"; feeSchedulesForEditPriceInput = feeSchedulesInput.Select(filterFeeSchedule); if (feeSchedulesForEditPriceInput.Length != 0) { for (int counterPriceInput = 0; counterPriceInput < feeSchedulesForEditPriceInput.Length; counterPriceInput++) { feeSchedulesForEditPriceInput[counterPriceInput]["PriceCapInput"] = Utilities.ParseCurrency(feeSchedulesForEditPriceInput[counterPriceInput]["PriceCapInput"].ToString()).ToString(); } } logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, "This is time of end of changing 'PriceCapInput' column."); } DataColumn contractIDColumn = new DataColumn("ContractID"); DataColumn procedureCodeColumn = new DataColumn("ProcedureCode"); DataColumn revenueCodeColumn = new DataColumn("RevenueCode"); DataColumn chargeMasterCodeColumn = new DataColumn("ChargeMasterCode"); DataColumn rateColumn = new DataColumn("Rate"); DataColumn flatFeeColumn = new DataColumn("FlatFee"); DataColumn priceCapColumn = new DataColumn("PriceCap"); DataColumn deletedColumn = new DataColumn("deleted"); contractIDColumn.DataType = typeof(System.Int64); procedureCodeColumn.DataType = typeof(System.String); revenueCodeColumn.DataType = typeof(System.Decimal); chargeMasterCodeColumn.DataType = typeof(System.String); rateColumn.DataType = typeof(System.Decimal); flatFeeColumn.DataType = typeof(System.Decimal); priceCapColumn.DataType = typeof(System.Decimal); deletedColumn.DataType = typeof(System.Boolean); deletedColumn.DefaultValue = false; feeSchedulesInput.Columns.Add(contractIDColumn); feeSchedulesInput.Columns.Add(procedureCodeColumn); feeSchedulesInput.Columns.Add(revenueCodeColumn); feeSchedulesInput.Columns.Add(chargeMasterCodeColumn); feeSchedulesInput.Columns.Add(rateColumn); feeSchedulesInput.Columns.Add(flatFeeColumn); feeSchedulesInput.Columns.Add(priceCapColumn); feeSchedulesInput.Columns.Add(deletedColumn); feeSchedulesInput.Columns["ContractID"].Expression = "CONVERT(ContractIDInput,System.Int64)"; feeSchedulesInput.Columns["ProcedureCode"].Expression = "CONVERT(ProcedureCodeInput,System.String)"; feeSchedulesInput.Columns["RevenueCode"].Expression = "CONVERT(RevenueCodeInput,System.Decimal)"; feeSchedulesInput.Columns["ChargeMasterCode"].Expression = "CONVERT(ChargeMasterCodeInput,System.String)"; feeSchedulesInput.Columns["Rate"].Expression = "CONVERT(RateInput,System.Decimal)"; feeSchedulesInput.Columns["FlatFee"].Expression = "CONVERT(FlatFeeInput,System.Decimal)"; feeSchedulesInput.Columns["PriceCap"].Expression = "CONVERT(PriceCapInput,System.Decimal)"; if (ValidateXML("FeeSchedule.xsd", feeSchedulesInput.GetXml()) != null) { DeleteErrors(feeSchedulesInput); } feeSchedulesReader = feeSchedulesInput.CreateDataReader(); logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, "This is time of start of going through the loop in input data set in 'ProcessFeeSchedule' function."); while (feeSchedulesReader.Read()) { contractIDTemp = feeSchedulesReader.GetValue(2).ToString().Trim(); procedureCodeTemp = feeSchedulesReader.GetValue(0).ToString().Trim(); revenueCodeTemp = feeSchedulesReader.GetValue(3).ToString().Trim(); chargeMasterCodeTemp = feeSchedulesReader.GetValue(1).ToString().Trim(); //Check constraints filterFeeSchedule = "ContractID='" + contractIDTemp + "'"; DataRow[] filteredFeeSchedules = dataDB.Tables["Contract"].Select(filterFeeSchedule); if (filteredFeeSchedules.Length == 0) { LogErrorFeeScheduleRow(procedureCodeTemp, contractIDTemp, revenueCodeTemp, feeSchedulesReader.GetValue(4).ToString().Trim(), feeSchedulesReader.GetValue(5).ToString().Trim(), feeSchedulesReader.GetValue(6).ToString().Trim(), chargeMasterCodeTemp, "ContractID does not exist!", ref errorFeeSchedules); DeleteIncorrectContract(ref feeSchedulesInput, contractIDTemp); continue; } if (!IsEmptyProcedure(procedureCodeTemp)) { filterFeeSchedule = "ProcedureCode='" + procedureCodeTemp + "'"; filteredFeeSchedules = dataDB.Tables["ProcedureCode"].Select(filterFeeSchedule); if (filteredFeeSchedules.Length == 0) { LogErrorFeeScheduleRow(procedureCodeTemp, contractIDTemp, revenueCodeTemp, feeSchedulesReader.GetValue(4).ToString().Trim(), feeSchedulesReader.GetValue(5).ToString().Trim(), feeSchedulesReader.GetValue(6).ToString().Trim(), chargeMasterCodeTemp, "Procedure Code does not exist!", ref errorFeeSchedules); DeleteIncorrectProcedure(ref feeSchedulesInput, procedureCodeTemp); continue; } } if (!IsEmptyRevenueCode(revenueCodeTemp)) { filterFeeSchedule = "RevenueCode='" + revenueCodeTemp + "'"; filteredFeeSchedules = dataDB.Tables["RevenueCode"].Select(filterFeeSchedule); if (filteredFeeSchedules.Length == 0) { LogErrorFeeScheduleRow(procedureCodeTemp, contractIDTemp, revenueCodeTemp, feeSchedulesReader.GetValue(4).ToString().Trim(), feeSchedulesReader.GetValue(5).ToString().Trim(), feeSchedulesReader.GetValue(6).ToString().Trim(), chargeMasterCodeTemp, "Revenue Code does not exist!", ref errorFeeSchedules); DeleteIncorrectRevenue(ref feeSchedulesInput, revenueCodeTemp); continue; } } if (!IsEmptyChargeMasterCode(chargeMasterCodeTemp)) { filterFeeSchedule = "ChargeMasterCode='" + chargeMasterCodeTemp + "'"; filteredFeeSchedules = dataDB.Tables["ChargeMaster"].Select(filterFeeSchedule); if (filteredFeeSchedules.Length == 0) { LogErrorFeeScheduleRow(procedureCodeTemp, contractIDTemp, revenueCodeTemp, feeSchedulesReader.GetValue(4).ToString().Trim(), feeSchedulesReader.GetValue(5).ToString().Trim(), feeSchedulesReader.GetValue(6).ToString().Trim(), chargeMasterCodeTemp, "Charge Master Code does not exist!", ref errorFeeSchedules); DeleteIncorrectChargeMaster(ref feeSchedulesInput, chargeMasterCodeTemp); continue; } } } feeSchedulesReader.Close(); logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, "This is time of end of going through the loop in input data set in 'ProcessFeeSchedule' function."); dataDB.EnforceConstraints = true; logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, "This is time of start of merging in 'ProcessFeeSchedule' function."); dataDB.Merge(feeSchedulesInput, false, MissingSchemaAction.AddWithKey); logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, "This is time of end of first merging in 'ProcessFeeSchedule' function."); } catch (Exception ex) { logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, ex.Message); feeSchedules = dataDB.Tables["FeeSchedule"]; DeletePerTableFeeScheduleErrors(ref feeSchedules, ref errorFeeSchedules); } finally { try { if (dataDB.Tables["FeeSchedule"].GetChanges(DataRowState.Unchanged) != null) { feeSchedules = dataDB.Tables["FeeSchedule"]; DeleteUnchangedFeeSchedules(ref feeSchedules); } } catch (Exception ex) { logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, ex.Message); } finally { logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, "This is time of end of 'ProcessFeeSchedule' function."); } } } public string ValidateXML(string strSchemaFile, string xmlString) { string functionName = "ValidateXML"; logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, "This is time of start of '" + functionName + "' function."); string strParseError = string.Empty; //Set the validation settings. XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidationType = ValidationType.Schema; settings.ValidationFlags = settings.ValidationFlags | XmlSchemaValidationFlags.ProcessInlineSchema; settings.ValidationFlags = settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings; settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack); //Create the XmlReader object. XmlReader reader = XmlReader.Create(strSchemaFile, settings); try { //Parse the file. while (reader.Read()) { } } catch (Exception ex) { logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, ex.Message); } finally { reader.Close(); logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, "This is time of end of '" + functionName + "' function."); } return strParseError; } private void ValidationCallBack(object sender, ValidationEventArgs args) { string functionName = "ValidationCallBack"; logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, "This is time of start of '" + functionName + "' function."); if (args.Severity == XmlSeverityType.Warning) logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, " Warning: Matching schema not found. No validation occurred." + args.Message); else logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, " Validation error: " + args.Message); logger.BufferMessage(GetType().Namespace, GetType().Name, functionName, "This is time of end of '" + functionName + "' function."); } |
|||
|
||||
thomas |
|
|||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 35 Всего: 65 |
martikan,
Приветствую. А теперь пожалуйста воспользуйся тегами код и отредаетируй свое сообщение. Тогда желание разбираться в твоем коде будет больше и вероятность ответов на твой вопрос возрастет в разы. ![]() Это сообщение отредактировал(а) thomas - 3.10.2007, 23:30 -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
|||
|
||||
thomas |
|
||||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 35 Всего: 65 |
Небольшая редакция поста martikan
-------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
||||
|
|||||
thomas |
|
|||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 35 Всего: 65 |
-------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Базы данных под .NET | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |