Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/75: Рейтинг темы: голосов - 75, средняя оценка - 4.97
 Аватар для FrzCherry
4 / 1 / 0
Регистрация: 07.11.2018
Сообщений: 33

Создание XML на основании схемы XSD

26.03.2020, 17:31. Показов 17335. Ответов 25

Студворк — интернет-сервис помощи студентам
Здравствуйте, коллеги.
Заранее сообщу, что перерыла множество информации в просторах интернета, но задача так и осталась не решенной.
Коротко о задаче: Есть XSD схема. Есть массив, с информацией (полученной из БД), на основании которой необходимо создать ХМL файл. Написан код, который создает визуально (в тхт редакторе) правильный хмl файл, но полученный xml файл не проходит валидацию в системе. Думаю проблема в невидимой части (в структуре) файла.
Пожалуйста, подскажите, в чем проблема. Почему файл созданный в коде, не соответствует xsd схеме?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
            XDocument xdoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
 
            // создаем первый элемент
            XElement xElemHEAD = new XElement("HEAD");
                    
            XElement iphoneCompanyElem = new XElement("STATFORM", "F6KX");
            XElement iphonePriceElem = new XElement("EDRPOU", "02045454");
            XElement iphonePriceRepDate = new XElement("REPORTDATE", data_f6kx.ToString("dd.MM.yyyy"));
                        
            xElemHEAD.Add(iphoneCompanyElem);
            xElemHEAD.Add(iphonePriceElem);
            xElemHEAD.Add(iphonePriceRepDate);
 
            // создаем корневой элемент
            XElement nbuStatReport = new XElement("NBUSTATREPORT");
            
           nbuStatReport.Add(xElemHEAD);
            for (int i = 0; i < arArray_F6KX_Central_Apparat_new.GetLength(0); i++)
            {
                // создаем элемент
                XElement xElemDATA = new XElement("DATA");
 
                XElement xElemEKP = new XElement("EKP", arArray_F6KX_Central_Apparat_new[i, 0]);
                XElement xElemR030 = new XElement("R030", arArray_F6KX_Central_Apparat_new[i, 1]);
                XElement xElemT100 = new XElement("T100", d_arArray_F6KX_Central_Apparat_new[i, 0]);
 
                xElemDATA.Add(xElemEKP);
                xElemDATA.Add(xElemR030);
                xElemDATA.Add(xElemT100);
 
                // добавляем в корневой элемент
                nbuStatReport.Add(xElemDATA);
                
            }
            
            // xdoc.Add(phones_0);
            xdoc.Add(nbuStatReport);
 
            //сохраняем документ
            xdoc.Save(@"D:\6KX.XML");
Вложения
Тип файла: zip t6kx.zip (2.1 Кб, 4 просмотров)
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.03.2020, 17:31
Ответы с готовыми решениями:

Создать XML файл из текстового и схемы xsd
Можно ли создать XML файл из текстового, имея схему xsd? Например, есть какие-то данные, занесенные в txt файл. Оттуда считать первую...

Создать XML-документ из схемы XSD
Доброго всем времени суток! Возникла необходимость по XSD схеме, подгружая ее в ПО, получить XML структурированный документ(в окне этой же...

Проверить правильность построения xsd схемы и создания для нее xml
Здравствуйте. Я новичок в xsd и xml, поэтому нужна помощь. Я написала схему по заданию, но при попытке проверить ее через...

25
 Аватар для FrzCherry
4 / 1 / 0
Регистрация: 07.11.2018
Сообщений: 33
30.03.2020, 15:09  [ТС]
Студворк — интернет-сервис помощи студентам
Когда убрала символ "#" из массива s_Ar1[i, 1] (заменила его на "840"), появляется другая ошибка - При проверке экземпляра, при сериализации.
Думаю, проблема в файле CS (который был сгенерирован на основании xsd схемы).
Миниатюры
Создание XML на основании схемы XSD  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,144
Записей в блоге: 2
30.03.2020, 15:36
Лучший ответ Сообщение было отмечено FrzCherry как решение

Решение

Цитата Сообщение от FrzCherry Посмотреть сообщение
При заполнении списка (свойств R030) я получаю ошибку в этой строке:
В s_Ar1[i, 1] у вас значение "#".
А методу Parse требуется значение "Item".

Само объявление значения перечисления [XmlEnum("#")] Item, означает, что при использовании в коде CTKOD_R030.Item - это значение будет сериализоваться как "#".
Обозначение "#" будет только в XML файле. Всюду в программе вы должны использовать "Item".

Так же не совсем корректно объявлено само перечисление.
Возможно появление багов при несогласованности типов.

Лучше задавать так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ublic enum CTKOD_R030
{
 
    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("#")]
    Item = 0,
 
    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("004")]
    Item004 = 4,
 
    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("008")]
    Item008 = 8,
 
    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("288")]
    Item288 = 288,
Добавлено через 1 минуту
Цитата Сообщение от FrzCherry Посмотреть сообщение
П.С.
Хотелось бы еще понять, как заполнить вместо списка массив (в этом случае):
Подучаете сначала список, а потом конвертируете его в массив методом ToArray()

Добавлено через 9 минут
Цитата Сообщение от FrzCherry Посмотреть сообщение
Когда убрала символ "#" из массива s_Ar1[i, 1] (заменила его на "840"), появляется другая ошибка - При проверке экземпляра, при сериализации.
Думаю, проблема в файле CS (который был сгенерирован на основании xsd схемы).
Получение значения перечисления из строки и целого числа.
C#
1
2
3
4
5
6
7
8
string value = "Item004";
CTKOD_R030 ctk004 = (CTKOD_R030) Enum.Parse(typeof(CTKOD_R030), value);
 
int number = 4;
ctk004 = (CTKOD_R030) number;
 
// Или специальным методом
ctk004 = (CTKOD_R030) Enum.ToObject(typeof(CTKOD_R030), number);
2
HF
 Аватар для HF
1317 / 897 / 200
Регистрация: 09.09.2011
Сообщений: 2,692
Записей в блоге: 2
30.03.2020, 17:18
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Возможно свойство NBUSTATREPORTHEAD.REPORTDATE должно быть не string типа, а DateTime.
Цитата Сообщение от FrzCherry Посмотреть сообщение
Спасибо. В файле CS, который был получен при помощи xsd.exe указано:
private string rEPORTDATEField;
ЭЭЭэээ.. вы чё творите то! Еретики!
Это схема! Если у вас есть требование, то схема - незыблима! Если по схеме сгенерирована модель - НЕ НАДО её исправлять. Если сказано - string - значит это сраньеготак - стринг и никак иначе. Это вы должны под схему и модель подстраиваться, а не она под вас. Валидацию на другой стороне тоже будут делать другие под вас? Рассуждайте здраво.

Небольшой экскурс в понимание схем.
Если это поле приватное - значит это защищённое поле от существующего публичного. У публичного навешаны все атрибуты определяющие его состояние.
Смотрим схему:
XML
1
2
3
4
5
                            <xs:element name="REPORTDATE" type="CTREPORTDATE">
                                <xs:annotation>
                                    <xs:documentation>Звітна дата</xs:documentation>
                                </xs:annotation>
                            </xs:element>
Тип данных и не строка и не дата, а CTREPORTDATE. Смотрим что это.
XML
1
2
3
4
5
    <xs:simpleType name="CTREPORTDATE">
        <xs:restriction base="xs:token">
            <xs:pattern value="(0[1-9]|[12]\d|3[01])\.(0[1-9]|1[0-2])\.\d\d\d\d"/>
        </xs:restriction>
    </xs:simpleType>
ООоухх... это токен, причём с маской. Причём такая суровая маска, на самом деле мы видим здесь dd.mm.yyyy. Можно дополнительно изучить модель.
Code
1
2
3
4
5
6
7
8
9
10
11
    private string rEPORTDATEField;
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="token")]
    public string REPORTDATE {
        get {
            return this.rEPORTDATEField;
        }
        set {
            this.rEPORTDATEField = value;
        }
    }
Отсылка есть на токен, но маски нет. Значит если вы сами не умеете валидировать по схеме, то за вас это сделают на принимающей стороне. И это я к чему, стоит вам тут DateTime написать, то или упадёт при запросе или откинут на приёме или отправите что-то не то, например полную ДатуВремя.

Добавлено через 11 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В s_Ar1[i, 1] у вас значение "#".
А методу Parse требуется значение "Item".
Само объявление значения перечисления [XmlEnum("#")] Item, означает, что при использовании в коде CTKOD_R030.Item - это значение будет сериализоваться как "#".
Обозначение "#" будет только в XML файле. Всюду в программе вы должны использовать "Item".
Вот это всё точно. Нужно просто чтобы её массив был полностью идентичен с энамом из модели.
Или создавайте маппер, который будет проецировать ваши данные в модель.

Иногда да, нет возможности например работать с реальным enum, или используются не все значения. Сделайте маппер, прогоняйте через него и всё. Будет что-то типа

C#
1
arr_of_obj[i].EKP = Utils.CTKOD_EKPMapper(s_Ar1[i, 0]);
1
 Аватар для FrzCherry
4 / 1 / 0
Регистрация: 07.11.2018
Сообщений: 33
31.03.2020, 14:34  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Получение значения перечисления из строки и целого числа.
Спасибо, большое. Этим вы фактически поставили точку в отдельном блоке.
Правда, я поступила несколько иначе, но благодаря Вашему сообщению, я разобралась с заполнением списка.
Решение, котое я использовала в этом случае -
C#
1
R030 = (CTKOD_R030)Enum.Parse(typeof(CTKOD_R030), s_Ar1[i, 3]),
Причем, предварительно, в массив
C#
1
s_Ar1
я добавила дополнительный столбец, в который и занесла Item, соответствующий элементам массива (колонке
C#
1
s_Ar1[i, 2]
). Таким образом, я не знаю как правильно это написать, но при заполнении экземпляра
C#
1
R030 = (CTKOD_R030)Enum.Parse(typeof(CTKOD_R030), s_Ar1[i, 3])
, элемент массива s_Ar1[i, 3] содержит Item, необходимый для вывода конкретного числа (или символа "#").
Я использовала свойства Enum - GetName, GetNames, GetValue - И у меня все получилось. Валидацию файл проходит на обеих сторонах.
Для себя поняла что в этой теме я не сильна, соответственно, буду учиться, учиться и еще раз учиться.
Признаюсь честно, я не до конца поняла эту строку R030 =
C#
1
(CTKOD_R030)Enum.Parse(typeof(CTKOD_R030), s_Ar1[i, 3]),
, но буду разбираться.
Перечисления - это конечно интересная тема.
Спасибо Вам ребята!

Добавлено через 47 минут
Цитата Сообщение от HF Посмотреть сообщение
Если по схеме сгенерирована модель - НЕ НАДО её исправлять
Программа xsd.exe генерит по схеме одну модель, в то время как программа XSD2Code может сгенерить, по той же схеме другую модель. Причем, в моем случае, как с <List> так и с Массивом []. Да, в модель лучше не лезть, но ведь и сгенирить её можно по разному.
Кстати, а что лучше использовать для создания модели из xsd ?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,144
Записей в блоге: 2
31.03.2020, 14:51
Цитата Сообщение от FrzCherry Посмотреть сообщение
Решение, котое я использовала в этом случае -
Мне очень не нравится ваш двумерный массив.
Он выглядит здесь очень надуманно.

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

У вас же по второму измерению элементы разные по назначению.
То есть это фактически свойства.
А вся матрица это либо таблица, либо линейный массив из типа со свойствами.

Откуда вы получаете такой странный массив?
Возможно часть ваших проблем находится в месте генерации этого массива.
1
HF
 Аватар для HF
1317 / 897 / 200
Регистрация: 09.09.2011
Сообщений: 2,692
Записей в блоге: 2
31.03.2020, 20:15
Цитата Сообщение от FrzCherry Посмотреть сообщение
Программа xsd.exe генерит по схеме одну модель, в то время как программа XSD2Code может сгенерить, по той же схеме другую модель.
Мы используем только микрософтовскую - xsd.exe. Сторонним я бы не доверял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.03.2020, 20:15
Помогаю со студенческими работами здесь

Нужен совет по анализу массива XML файлов при отсутствии XSD схемы
Всем, привет! Часто возникает потребность собрать данные из тысяч XML-файлов при этом XSD схема оказывается либо несоответствующей,...

Как узнать имя элемента схемы XSD при построчном чтении файла xml
Здравствуйте! Пишу программу которая читает xml и при помощи его схемы xsd должна вытащить еще и имя элемента.Никак не получается....

Выгрузка в XML файл результатов запроса. Создание xml схемы с имеющегося xml файла
Доброго времени суток. Имеется необходимый для загрузки пример XML файла и из него необходимо построить XML схему для выгрузки данных...

Создание XML документ на основе XSD шаблона?
День добрый! Такой вопрос, на основе XSD шаблона нужно создать, а затем проверить созданный XML документ. Средствами Delphi 6, возможно...

Проверка XML с XSD которой ссылается на другой XML файл
Допустим есть готовая структура с данными (xml1.xml) &lt;packet&gt; &lt;zap&gt; &lt;ID&gt;1&lt;/ID&gt; &lt;NAME&gt;NAME1&lt;/NAME&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru