Как сформировать файл в формате xml в соответствии с xsd схемой документа на приемку товара
Добрый день! Помогите разобраться с механизмом XDTO! Читаю, читаю, никак не могу вкурить!
Проблема в том что xml файл (и соотоветсвенно xsd файл) выгружен не из 1с. Из какой системы точно не знаю (если это нужно, могу узнать). Схема вот такая:
?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:od="urn:schemas-microsoft-com:officedata">
<xsd:element name="dataroot">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Стадник" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="generated" type="xsd:dateTime"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="Стадник">
<xsd:annotation>
<xsd:appinfo/>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="НомерДела" minOccurs="0" od:jetType="longinteger" od:sqlSType="int" type="xsd:int"/>
<xsd:element name="Специальность" minOccurs="0" od:jetType="text" od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="5"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="НомерПриказа" minOccurs="0" od:jetType="integer" od:sqlSType="smallint" type="xsd:short"/>
<xsd:element name="ЛьготаПриПрочихРавных" minOccurs="1" od:jetType="yesno" od:sqlSType="bit" od:nonNullable="yes" type="xsd:boolean"/>
<xsd:element name="РЯЕГЭ100" minOccurs="0" od:jetType="integer" od:sqlSType="smallint" type="xsd:short"/>
<xsd:element name="НуждаетсяВОбщежитии" minOccurs="1" od:jetType="yesno" od:sqlSType="bit" od:nonNullable="yes" type="xsd:boolean"/>
<xsd:element name="ОЕГЭ100" minOccurs="0" od:jetType="integer" od:sqlSType="smallint" type="xsd:short"/>
<xsd:element name="ГодЕГЭРЯ" minOccurs="0" od:jetType="longinteger" od:sqlSType="int" type="xsd:int"/>
<xsd:element name="ГодЕГЭО" minOccurs="0" od:jetType="longinteger" od:sqlSType="int" type="xsd:int"/>
<xsd:element name="ДатаДоговора" minOccurs="0" od:jetType="datetime" od:sqlSType="datetime" type="xsd:dateTime"/>
<xsd:element name="НомерДоговора" minOccurs="0" od:jetType="text" od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="150"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
Содержание xml файла примерно такое:
Полей там намноооооого больше, я урезал чутка. На основе этих данных надо создавать разные объекты конфигурации. Я хочу, например, загнать содержимое xml в таблицу значений а из неё по циклу создавать объекты.
Изначально я использовал ДокументыДом
ЧитатьХМЛ = Новый ЧтениеXML;
ЧитатьХМЛ.ОткрытьФайл(ИмяФайла);
// Через построительDOM протаскиваем наш XML-файл в ДокументDOM.
// как нашей душе угодно. Дальнейшие комментарии излишне.
Сообщить("Версия XML: " + ДокументДУМ.ВерсияXML);
КорневойУзел = ДокументДУМ.ПервыйДочерний;
Сообщить("Корневой узел: "+КорневойУзел.ИмяУзла);
УзлыКорневого = КорневойУзел.ДочерниеУзлы;
ВсегоУзловКорневого = УзлыКорневого.Количество(); // Получаем коллекцию узлов корневого элемента
Таблица = Новый ТаблицаЗначений;
Сообщить("Корневой узел содержит "+ВсегоУзловКорневого+" узла(ов):");
Для каждого узла из УзлыКорневого Цикл
Для Н = 0 По узла.ДочерниеУзлы.Количество() - 1 Цикл
Имя = Таблица.Колонки.Найти(узла.ДочерниеУзлы[Н].ИмяУзла);
Если Имя = Неопределено Тогда
Имя = узла.ДочерниеУзлы[Н].ИмяУзла;
Таблица.Колонки.Добавить(Имя);
КонецЕсли;
НовСтрока = Таблица.Добавить();
НовСтрока.Имя = ЗначениеУзла;
Н=Н+1;
КонецЦикла;
Итак, что же мы будем делать, для того, что бы научиться штамповать XML на основе вашего эталона? Опишу всё по порядку.
Имеется:
Какой то XML (xmlfile.xml), сохраненный в текстовом формате в файл. Ниже приведу текст:
Шаг 1. Создание XSD из XML.
- Утилита xsd.exe - создатель Microsoft.
- Утилита xsd2code.exe - стороннее приложение, которое умеет все тоже самое, что и xsd.exe, но доступно для скачивания напрямую (на данный момент стала платной с Trial периодом).
- Использование любых онлайн сервисов.
- Далее перейдя в папку:
C:\Program Files (x86)\Microsoft SDKs\Windows>
- Воспользуемся поиском, и найдем файл xsd.exe, после чего (что бы упростить себе работу), скопируем его в созданную в корне диска папку C:\xmltoxsd. Далее в эту же папку мы копируем наш xmlfile.xml и все готово к началу.
Отрываем "Командную строку" (Пуск -> "Выполнить" -> "cmd"), переходим в наш каталог и вызываем с параметрами по умолчанию xsd.exe, передавая наш xmlfile.xml параметром:
И видим, что рядом появился файл xmlfile.xsd с содержимым.
Вот и все! Этих действий достаточно, для создания примитивного XSD файла, с которым можно работать. Но стоит понимать, что сам xsd.exe, как и любая другая утилита, ничего не знает про типы ваших полей (поэтому почти всегда тип полей будет string), а так же о всех вариациях атрибутов и параметров. То есть, если у какого-то тега нет атрибута в вашей XML, тогда его и не будет в описании. Поэтому XML должен быть наиболее полным и в случае, если элемент может содержать несколько дочерних полей, лучше добавить как минимум два, что бы xsd.exe понял, что это коллекция.
Синтаксис XSD не очень сложный, поэтому, если пишется достаточно серьезное описание, возможно придется поработать и напильником.
Шаг 2. Создание Class из XSD.
После выполнения появится файл xmlfile.cs, содержимое которого приведено ниже в сжатом виде:
Как видите, для внутреннего элемента catalog был создан класс catalogBook, у которого поля соответствуют полям в XML, а поле Id помечено как атрибут. Xsd.exe корректно понял, что внутри catalog хранится коллекция книг, поэтому появилось свойство Items, для наполнения дочерней коллекции.
Замечание: xsd.exe не умеет добавлять комментарии к получившимся классам и полям. В описании XSD существует элемент под названием < xs:annotation > , который чаще всего содержит < xs:documentation >, внутри которого размещено описание поля. По идее, оно должно быть размещено в /// описании, но на текущий момент xsd.exe отказывается добавлять текст в описание, поэтому приходится прибегать к альтернативам, таким как xsd2code или онлайн сервисам.
Шаг 3. Сериализация объектов в XML.
Получившиеся классы у нас лежат в файле xmlfile.cs. Далее его содержимое или сам файл добавляем в проект Visual Studio, после чего можно с ним работать. Я создам демонстративный объекты книг, после чего сохраню в файл в формате XML.
После запуска и открытия Output.xml можно увидеть, что мы сохранили так, как мы хотели (Нижний файл - "Созданный кодом").
Как мы видим, форматирование было соблюдено, а данные были наполнены нами.
Здравствуйте, коллеги.
Заранее сообщу, что перерыла множество информации в просторах интернета, но задача так и осталась не решенной.
Коротко о задаче: Есть XSD схема. Есть массив, с информацией (полученной из БД), на основании которой необходимо создать ХМL файл. Написан код, который создает визуально (в тхт редакторе) правильный хмl файл, но полученный xml файл не проходит валидацию в системе. Думаю проблема в невидимой части (в структуре) файла.
Пожалуйста, подскажите, в чем проблема. Почему файл созданный в коде, не соответствует xsd схеме?
Помощь в написании контрольных, курсовых и дипломных работ здесь
Создать XML файл из текстового и схемы xsd
Можно ли создать XML файл из текстового, имея схему xsd? Например, есть какие-то данные, занесенные.
Создать XML-документ из схемы XSD
Доброго всем времени суток! Возникла необходимость по XSD схеме, подгружая ее в ПО, получить XML.
Проверить правильность построения xsd схемы и создания для нее xml
Здравствуйте. Я новичок в xsd и xml, поэтому нужна помощь. Я написала схему по заданию, но при.
Нужен совет по анализу массива XML файлов при отсутствии XSD схемы
Всем, привет! Часто возникает потребность собрать данные из тысяч XML-файлов при этом XSD схема.
Можете для остальных написать чем вы его сгенерировали.
Можете для остальных написать чем вы его сгенерировали.Добавлено через 25 минут
Немного дрожат ручки У меня MS Visual Studio 2018. В проект я добавила класс (файл CS). Что мне следует сделать теперь? Что означает "заполняете модель" ? Корректировать файл CS? Если корректировать, то как?
Не надо корректировать модель. Созданный CS - и есть та модель, с которой вы работаете, она же отражает схему и схема её.
Заполнить модель - это и значит. Если есть класс User, то создаёте объект, наполняете данными. Всё как обычно.
А теперь видимо то что вы не поняли - как запрос сделать. Вот же вы сами это сказали: "Есть массив, с информацией (полученной из БД), на основании которой необходимо создать ХМL файл". Это оно и есть.
Ответ прост - сериализовать! Это надеюсь вы уже слышали, видели и надеюсь делали. Имеете объект (класс, коллекция, хоть что..) сериализуете и. отправляете через веб-клиент. Ну или если очень надо - XML можете ещё посмотреть, сохранить.
интересно, так же, как мы используем-объявление для привязки XML к DTD, как мы делаем это с XSD?
это xsi: NoNamespaceSchemaLocation, который делает трюк? Или это просто другое пространство имен?
[редактирование] И это
..строка только для предоставления нам уникального пространства имен XML или также предоставляет информацию о том, где может быть расположена схема?
попробовать schemaLocation.
но ведь это мог бы пойти не так, как здесь, но опять же, это считается ошибкой для причина.
короче говоря : я просто доверяю ему, пока без вреда: -)
Я не думаю, что любой наполовину приличный XML-процессор может игнорировать этот "намек" в эти дни.
URL-адреса всегда уникальны, но в некоторых случаях некоторая информация будет предоставлена под URL-адресом.
xsi:noNamespaceSchemaLocation и xsi: schemaLocation предоставляют подсказки XML-процессорам, которые решают подчиняться этим подсказкам. Но это только намеки. Они не обязательно приводят к проверке документа на соответствие схеме.
Я обычно просто включаю пространство имен и ожидаю, что если кто-то обрабатывает его, чтобы проверить его, то они получат схему и настроят свою среду обработки, чтобы она могла найти XSD. У меня был ограниченный успех с xsi:schemaLocation и такие атрибуты. Большинство проблем обычно сосредоточены вокруг поиска самого файла XSD. Некоторые процессоры хотят, чтобы путь был включен, что очень весело, если XSD находится в файловой системе, а не на веб-сервере.
каждый процессор, похоже, реализует поиск немного по-другому. Некоторые используют отдельные объекты каталога схем, другие требуют загрузки и присоединения схем по отдельности. Если вы не предоставляете код для обработки документов, вам лучше не включать xsi:schemaLocation или xsi:noNamespaceSchemaLocation ИМХО. Единственное, что может сделать их включение, это hamstring, кто обрабатывает ваш документ либо помещает схему в одно и то же место, либо находит способ заставить выбранный процессор игнорировать или обходить спецификация местоположения.
в качестве примечания, самая большая проблема, с которой я столкнулся, была на самом деле с DTDs, которые были указаны с помощью SYSTEM декларация, которая относится к "c:\somepath\doc.dtd" . Проблема заключалась в том, что я обрабатывал документы на коробке FreeBSD. Я закончил тем, что написал свой собственный распознаватель для сопоставления путей в стиле Windows с локальной файловой системой, поскольку я не мог изменить сами документы и должен был их проверить.
Это не глупый вопрос, но Джон Сондерс прав.
Так же, как мы используем-decleration для привязки XML к DTD, как мы делаем это с XSD?
вот суть проблемы-вы не можете. Одна из проблем подхода DTD заключалась в том, что в документе указывался механизм проверки, а не потребитель документа. После DTD вы можете взять XML-документ и проверить его с помощью XSD или RELAX NG или другого механизма - они разъединены (по крайней мере теоретически). Любая ссылка XSD является только подсказкой и является необязательной. невозможно проверить произвольный документ.
Читайте также: