Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проверк XML на соотв схеме при выгрузке из DataSet, проверка данных DataSet c XSD 
:(
    Опции темы
crazy_turist
Дата 29.6.2007, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.6.2007

Репутация: нет
Всего: нет



Проверить данных XML документа на соответствие схеме можно с помощью XMLValidationReader,это написано почти в каждом учебнике smile Выгрузить данные из DataSet в XML можно так: 

DataSet ds;
ds.WriteXml("D:\Data\example.xml");

А вот как при этом еще проверить, соответствуют ли данные DataSet конкретной схеме XSD?
PM MAIL   Вверх
tol05
Дата 29.6.2007, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Цитата

DataSet.GetXmlSchema()
Возвращает XSD-схему для XML-представление данных, хранящихся в классе DataSet.



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
crazy_turist
Дата 29.6.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.6.2007

Репутация: нет
Всего: нет



Вы не поняли сути вопроса. схема уже разработана и лежит в конкретном файле "example.xsd".
а вот данные, введенные пользователем в DataSet, могут ей не соответствовать. Вопрос-как перед выгрузкой даных из DataSet в XML проверить соответствуют ли данные DataSet схеме?
PM MAIL   Вверх
thomas
Дата 29.6.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



crazy_turist
Проверять значения вводимые пользователем на валидность.
Плюс в UI юзверь должен четко представлять что он вводит и куда (что отнего ожидает это поле ввода).
Цитата

а вот данные, введенные пользователем в DataSet

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




--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
crazy_turist
Дата 29.6.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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-файла!!

PM MAIL   Вверх
thomas
Дата 29.6.2007, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Цитата

В ДатаСет создана соответствующая таблица не "ручками", 

Таким образом мы получили DataSet, основанный на схеме, ВСТРОЕННЫМИ средствами NET
Далее вопрос-КАК ПРОВЕРИТЬ ДАННЫЕ ВСТРОЕННЫМИ СРЕДСТВАМИ NET?


Автоматизация, млин...  smile 
А теперь "ручками" послать запрос по мылу разработчикам: "How?".  smile 

А если серьезно, то что при наличии схемы таблицы НЕИЗВЕСТНО что там в полях должно быть?
Тогда на фига вообще нужны эти схемы. Только названия полей передавать.  smile 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
crazy_turist
Дата 2.7.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.6.2007

Репутация: нет
Всего: нет



А теперь "ручками" послать запрос по мылу разработчикам: "How?". 

Ну зачем сразу к разработчикам, когда на форумах много умных людей есть? smile
Я вам больше доверяю .. иногда smile)

а если по существу, то на данный вопрос How?" ответ мной найден. Выложу его попозже.
PM MAIL   Вверх
thomas
Дата 9.7.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



crazy_turist

Привет.
Я тут тоже столкнулся с вопросами XML. Нужно написать приложение которое принимает файл Excel с адресами клиентов, а на выходе должен быть супер навороченный XML. 

ТАК ЧТО ТВОЙ ОПЫТ мне очень пригодиться.

По поводу
Цитата

Проверить данных XML документа на соответствие схеме можно с помощью XMLValidationReader

В 2005 студии это уже не канает. Устарело. На замену нашел вот это.
Код

Public Sub ValidateXML(ByVal strSchemaFile As String)

        ' Set the validation settings.
        Dim settings As XmlReaderSettings = New XmlReaderSettings()
        settings.ValidationType = ValidationType.Schema
        settings.ValidationFlags = settings.ValidationFlags Or XmlSchemaValidationFlags.ProcessInlineSchema
        settings.ValidationFlags = settings.ValidationFlags Or XmlSchemaValidationFlags.ReportValidationWarnings
        AddHandler settings.ValidationEventHandler, AddressOf ValidationCallBack

        ' Create the XmlReader object.
        Dim reader As XmlReader = XmlReader.Create(strSchemaFile, settings)

        ' Parse the file. 
        While (reader.Read())
        End While

    End Sub

    Private Shared Sub ValidationCallBack(ByVal sender As Object, ByVal args As ValidationEventArgs)
        If (args.Severity = XmlSeverityType.Warning) Then
            Windows.Forms.MessageBox.Show("   Warning: Matching schema not found.  No validation occurred." + args.Message)
        Else
            Windows.Forms.MessageBox.Show("   Validation error: " + args.Message)
        End If
    End Sub


Поделись способом проверки .

Мне в приложении придется загружать данные из Excel в DataSet, плюс создать DataSet на основе заданного файла xsd, далее полученные данные из Excel записать в нужное место в DataSet'е, созданного по xsd, ПРОВЕРИТЬ что получилось (пригодиться твой способ  smile ) и наканец записать этот хитрый XML и отправить его другому приложению для обработки. Там на каждый адрес создадут Штрих-код и вышлют XML обратно мне. Мне же нужно будет распечатать адреса со Штрих-кодом на конверты. 




--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
mr.DUDA
Дата 9.7.2007, 23:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Да просто всё, на самом деле.

1. читаем XSD-схему в новый пустой датасет (DataSet.ReadXmlSchema)
2. выполняем Merge проверяемого датасета в пустой датасет со схемой
3. если п.2 свалился - значит схема не подходит к датасету


--------------------
user posted image
PM MAIL WWW   Вверх
martikan
Дата 2.10.2007, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 2.10.2007

Репутация: нет
Всего: нет



Zdravstvyjte, yvazhaemuje znatoki!
Esli mozhna oyblikyjte kod. S bol'shum yvazheniem, Andrey.
PM MAIL   Вверх
martikan
Дата 2.10.2007, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.");
        }

     
PM MAIL   Вверх
thomas
Дата 3.10.2007, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



martikan
Приветствую.
А теперь пожалуйста воспользуйся тегами код и отредаетируй свое сообщение.
Тогда желание разбираться в твоем коде будет больше и вероятность ответов на твой вопрос возрастет в разы.
 smile 

Это сообщение отредактировал(а) thomas - 3.10.2007, 23:30


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
thomas
Дата 5.10.2007, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Небольшая редакция поста martikan
Код

<?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>

Код

 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. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
thomas
Дата 5.10.2007, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Привет всем.
Может кому будет интересно про XML валидацию посмотреть 
Вот пример с codeproject.



--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1192 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.