Войти
Windows. Программы. Железо. Интернет. Безопасность. Мой компьютер
  • Лучшие приложения для Android: краткий обзор бесплатных программ Запись телефонных разговоров
  • Как полностью удалить Антивирус Касперского?
  • Е майл почта. Моя почта. Платный или бесплатный е-мэйл
  • Лучшие программы для поиска дубликатов (одинаковых) файлов
  • Ошибка загрузки метаданных
  • Недавно кто-то пытался войти в Ваш аккаунт Google Почему приходят оповещения что вк выполнен вход
  • Обработка 1с xml из xsd. Типизированный объект DataSet. Чтение и запись XML-документов. Добавление XDTO пакета

    Обработка 1с xml из xsd. Типизированный объект DataSet. Чтение и запись XML-документов. Добавление XDTO пакета

    Аннотация: XML-схемы данных (XSD). Создание XSD-схемы в среде Visual Studio .NET. Создание типизированного объекта DataSet. Получение информации о структуре объекта DataSet. Загрузка XML-документов и XSD-схем в типизированный и обычный объекты DataSet. Методы ReadXml и ReadXmlSchema. Запись содержимого и структуры типизированного и обычного объекта DataSet. Методы WriteXml и WriteXmlSchema

    Типизированный объект DataSet. Чтение и запись XML-документов

    XML-схемы данных (XSD)

    Схемы данных 1Точный перевод XML Schema Document - < схема документа XML >, однако мы будем в дальнейшем использовать термин "схема данных XML". XSD ( XML Schema Document, XSD) представляют собой альтернативный способ правил построения XML-документов. По сравнению с DTD, схемы обладают более мощными средствами для определения сложных структур данных, обеспечивают более понятный способ описания грамматики языка, способны легко модернизироваться и расширяться. Схема XSD может содержать следующую информацию:

    • представление связей между элементами данных, аналогичное связям внешних ключей между таблицами в реляционной базе данных;
    • представление уникальных идентификаторов, подобных первичному ключу;
    • спецификацию типов данных каждого индивидуального элемента и атрибута в XML-документе.

    Для создания схемы данных в Visual Studio .NET в главном меню переходим File \ New \ File и выбираем из списка шаблонов (см. рис. 11.3) XML Schema . Появляется окно с надписью "Чтобы начать, перетащите объекты из окна Server Explorer или Toolbox на рабочую область (область дизайна) или щелкните правой кнопкой" (рис. 11.1):


    Рис. 11.1.

    Дело в том, что мы находимся в режиме дизайна. Переключаемся в режим кода, для чего нажимаем на кнопку(XML):

    Первая строка - это уже знакомое указание на то, что схема представляет собой XML-документ с корневым элементом xs:schema . Префикс xs : предваряет все элементы схемы, указывая на свое пространство имен. Во второй строке располагается длинное, подробное и зачастую совершенно ненужное описание схемы (сравните с аналогичным кодом для HTML-страниц). Для корректной работы вполне достаточно ограничиться следующим представлением:

    Впрочем, встроенные средства визуализации студии предполагают наличие этой "шапки", поэтому ее не следует удалять. Создание схемы, описывающей заданный XML-документ в среде Visual Studio .NET - довольно простая задача. Создадим следующий документ XMLEasy.xml:

    1

    Переключаемся на вкладку(Data) и видим всего одну запись (рис. 11.2).


    Рис. 11.2.

    Создать схему, описывающую этот документ, можно несколькими способами: в главном меню выбрать пункт "XML \ Create Schema" (рис. 11.3, А), в режиме XML в контекстном меню выбрать этот же пункт (рис. 11.3, Б), в режиме Data в контекстном меню выбрать этот пункт (рис. 11.3, В), и, наконец, в режиме Data нажать на кнопку панели инструментов XML (рис. 11.3, Г).


    Рис. 11.3.

    В любом случае появляется схема документа в виде таблицы (рис. 11.4). Оставим пока режим Schema и переключимся в режим(XML).


    Рис. 11.4.

    Среда сгенерировала XML-код, описывающий структуру документа:

    Сюда входит также описание, необходимое для дальнейшего манипулирования схемой при помощи объектов ADO .NET. В исходном документе XMLEasy.xml появилась ссылка на схему данных:

    Документ XMLEasy.xsd был автоматически создан в той же самой директории, где находится XMLEasy.xml.

    Для того чтобы научиться понимать схемы XSD, вначале следует поработать с описанием данных в чистом виде, без дополнительных элементов. В таблице 11.1 приводится несколько простейших XML-документов и их схем, сформированных без привязки к объектам ADO .NET.

    Таблица 11.1. Примеры составления XSD-схем
    Содержимое XML-документа Содержимое XSD-схемы

    1

    Описание
    В документе XMLEasy.xml элемент TOUR - корневой элемент, содержащий дочерний элемент IDTOUR. Общая схема для корневого элемента имеет следующий вид:

    : Содержимое элемента...

    Дочерние элементы описываются так:

    Содержимое XML-документа Содержимое XSD-схемы

    1 Кипр 25 000,00р. В стоимость двух взрослых путевок входит цена одной детской (до 7лет) 2 Греция 32 000,00р. В августе и сентябре действуют специальные скидки 3 Таиланд 30 000,00р. Не включая стоимость авиабилета 4 Италия 26 000,00р. Завтрак в отеле включен в стоимость путевки 5 Франция 27 000,00р. Дополнительные экскурсии не входят в стоимость путевки

    Описание
    Корневой элемент TABLE содержит элемент TOUR , состоящий, в свою очередь, из группы дочерних элементов. Элемент choice определяет выбор других элементов, причем значение "unbounded" (неограниченно) атрибута maxOccurs указывает на возможность неограниченного наличия групп TOUR .

    : :

    Содержимое XML-документа Содержимое XSD-схемы

    1 Кипр 25 000,00р. 1 В стоимость двух взрослых путевок входит цена одной детской (до 7лет)


    Рис. 11.5.
    Описание
    Для элемента IDTOUR был установлен тип данных int , для элемента CLOSED - тип boolean , для остальных - по умолчанию тип string . Изменять тип данных можно непосредственно в режиме XML-схемы данных, но более удобно - в режиме Schema (в данном случае режим будет называться DataSet ) выбирать тип данных из выпадающего списка (рис. 11.5):

    В программном обеспечении к курсу вы найдете все файлы этой таблицы в папке XSD (Code\Glava5\ XSD).

    Задание типа данных в XML-документе (последний пример - табл. 11.1) - один из способов ограничения содержимого. Для ограничения значения заданного типа применяются дополнительные атрибуты. В следующем фрагменте схемы значение элемента PRICE должно быть в пределах от 50 до 100:

    Для ограничения XML-документа некоторыми фиксированными значениями используется следующая конструкция:

    Здесь элемент NAME может принимать только одно фиксированное значение из пяти названий стран.

    Разработка XSD-схемы представляет собой довольно кропотливую работу. Визуальные средства среды Visual Studio .NET значительно облегчают эту задачу. Для освоения основных концепций желательно изучить несколько схем XML-документов, созданных автоматически. В таблицах 11.2-11.4 приводится описание основных элементов и атрибутов, которые при этом можно встретить.

    Таблица 11.2. Элементы XSD-схем
    Элемент Описание
    all Вложенные элементы могут определяться в произвольном порядке
    annotation Родительский элемент элементов-комментариев и
    any Любые вложенные элементы
    anyAttribute Любые атрибуты
    appInfo Элемент-коментарий. Задает титул схемы
    attribute Атрибут
    attributeGroup Группа атрибутов
    choice Выбор других элементов. Аналог оператора "|" в DTD
    complexContent Ограничения или расширения модели содержимого сложного типа
    complexType Элемент сложного типа
    documentation Элемент-комментарий. Предоставляет информацию о схеме
    element Элемент
    extension Расширения элемента
    field Объявление поля. Применяется внутри элемента для определения полей
    group Группа элементов
    import Импорт декларации типов из другой схемы
    include Включение другой схемы в существующее пространство имен
    key Задание элемента или атрибута с ключом, указывающим на другой элемент
    keyref Задание элемента или атрибута, на который указывает ключ
    list Элемент, который может содержать список значений
    redefine Переопределение уже объявленных элементов
    restriction Ограничение элемента
    schema Корневой элемент схемы
    selector Селектор для отбора XML-элементов
    sequence Последовательность других элементов. Аналог оператора "," в DTD
    simpleContent Модель, содержимое которой представляет только символьные данные
    simpleType Элемент простого типа
    union Элемент или атрибут, который может иметь множественное значение
    unique Элемент или атрибут, который должен иметь уникальное значение
    Таблица 11.3. Атрибуты - ограничения XSD-схем
    Атрибут Описание
    enumeration Список значений
    length Длина
    maxLength Максимальная длина
    minLength Минимальная длина
    maxExclusive Максимальное значение
    maxInclusive Максимальное значение включительно
    minExclusive Минимальное значение
    minInclusive Минимальное значение включительно
    fractionDigits Количество знаков после запятой в дробных числах
    totalDigits Количество цифр
    pattern Образец (паттерн) содержимого элементов
    default Значение элемента или атрибута по умолчанию
    elementFormDefault Задание свойств локального элемента как глобально определенного
    fixed Фиксированное значение элемента или атрибута
    form Локально объявленные элементы определяются в конкретных экземплярах документов
    itemType Тип пунктов списка
    memberTypes Тип членов, использованных в объединении (union )
    maxOccurs Максимальное количество вхождений элемента
    minOccurs Минимальное количество вхождений элемента
    mixed Задание элемента, имеющего смешанный тип
    name Название элемента или атрибута
    namespace Пространство имен
    noNamespace Задание местоположения документа-схемы,
    SchemaLocation не имеющего результирующих пространств имен
    nillable Определение того, что элемент может иметь пустое значение NULL (nil )
    ref Задание ссылки на глобально определенный элемент
    schemaLocation Определение местоположения схемы
    substitutionGroup Определение замены элементов другими элементами
    targetNamespace Результирующее пространство имен схемы
    type Тип элемента
    use Является элемент обязательным или нет
    value Значение элемента схемы
    xsi:nil Задание реального содержания пустого (NULL ) элемента XML-документа
    xsi:schemaLocation Реальное местоположение элемента в XML-документе
    xsi:type Реальный тип элемента в XML-документе

    Появилась задача создания XML файла на основе XSD схемы. Поиски по форумам приводили к большому количеству обсуждений, связанных с непониманием процесса, и всего к паре статей объясняющих суть. Люди задавали вопросы, бились над решением, но после того как задача поддавалась им, просто исчезали, не описав механизм. Это подтолкнуло на создание простого описания процесса.
    P.S. Не ругайтесь сильно, моей целью не было создание некой наукообразной статьи, строго использующей правильную терминологию, а желание просто помочь сделать первый шаг к пониманию очень мощного механизма обмена через XML.
    P.P.S. Сразу должен оговориться, что прилагаемый к статье файл выгрузки является только заготовкой, создающей только часть требуемой структуры XML файла, т.к. моя работа с этой выгрузкой имела скорее познавательный характер (копировать предыдущий документ по экспорту на сайте ФТС и загружать из Excel"овского файла только табличную часть Товары представилось более эффективным решением), а недостаток времени не позволял дописать создание всей структуры, исходя только из соображений перфекционизма.

    Итак, зарегистрировавшись на сайте ФТС, стало понятно, что для создания документов Статистической отчетности по экспорту требуется выгрузка данных из документов Реализация товаров и услуг Управления торговлей и создания файла для загрузки.

    Там возможно два варианта загрузки.

    Первый: загрузка табличной части с Товарами из файла Excel (этот вариант и был выбран как рабочий, т.к. имел те плюсы, что не надо было возиться с обработкой "Шапки" документа, а можно было просто копировать предыдущий, изменив в "Шапке" то, что требовалось).

    Второй: создание XML файла по схеме скачаной с сайта ФТС в виде "Альбома форматов электронных форм документов". Альбом представляет из себя достаточно большое количество XSD схем. В них была найдена схема "Статистической формы учета перемещения товара" и дополнительные файлы с описаниями типов для нее. Схемы прилагаются к статье в архиве с обработкой.

    Для просмотра XSD схем использовался бесплатный Майкрософтовский XML Notepad 2007.

    На изображении показан основной файл со схемой XSD "Статистическая форма учета перемещения товара". На изображении выделены основные блоки XSD схемы, требуемые нам для ее понимания.

    Из схемы видно, что нам надо получить XML файл, заполненый структурой, указанной в ветке "xs:element" типа StaticFormType.

    Структура может быть достаточно сложной (как и в нашем случае). С описаниями типов, присутствующими непосредственно в ветке, вынесенными в отдельную ветку или даже находящимися в другом файле.

    Данная структура имеет тип StaticFormType, который в свою очередь, состоит из базового типа BaseDocType, набора объектов разных типов и текстовых аттрибутов.

    Базовый тип BaseDocStyle описывается в другом файле (и пространстве имен)
    .

    Этот файл содержит в себе еще массу типов, которые не используются в нашем случае.

    Теперь перейдем к работе в 1С. В двух словах, то что нам надо сделать сводится к следующему:

    1. Создается ФабрикаXDTO

    НашаФабрикаXDTO = СоздатьФабрикуXDTO(МассивПолныхИменФайловСоСхемамиXSD);

    2. В фабрикеXDTO создаются все сложные типы данных, которые далее мы будем заполнять в создаваемом файле XML:

    StaticFormType = МояФабрикаXDTO.Тип("urn:customs.ru:Information:CustomsDocuments:StaticForm:5.4.0", "StaticFormType");

    Типы данных, входящих в некий тип, можно получить из коллекции его свойств:

    CUOrganizationType = StaticFormType.Свойства.Получить("Consignee").Тип; NameType = CUOrganizationType.Свойства.Получить("OrganizationName").Тип; ShortNameType = CUOrganizationType.Свойства.Получить("ShortName").Тип; LanguageCodeType = CUOrganizationType.Свойства.Получить("OrganizationLanguage").Тип;

    3. Когда все сложные типа данных созданы, создаем на их основе структуру XML файла, состоящую из объектов ФабрикиXDTO:

    StaticFormType_ОбъектXDTO = МояФабрикаXDTO.Создать(StaticFormType); // коллекция с документами NewDocuments = МояФабрикаXDTO.Создать(DocumentsType); NewDocuments.PrDocumentName = МояФабрикаXDTO.Создать(PrDocumentNameType, "Товарная накладная"); NewDocuments.PrDocumentNumber = МояФабрикаXDTO.Создать(PrDocumentNumberType, "123-номер"); NewDocuments.PrDocumentDate = МояФабрикаXDTO.Создать(PrDocumentDateType, "2014-10-05"); StaticFormType_ОбъектXDTO.Documents.Добавить(NewDocuments);

    Одновременно заполняем элементарные (простых типов) реквизиты.

    4. Ну и наконец выгружаем все из ФабрикиXDTO в файл:

    ФайлXML = Новый ЗаписьXML(); ФайлXML.ОткрытьФайл(ИмяФайла); ФайлXML.ЗаписатьОбъявлениеXML(); МояФабрикаXDTO.ЗаписатьXML(ФайлXML, StaticFormType_ОбъектXDTO); ФайлXML.Закрыть();

    P.S. В архиве содержится файл заготовки выгрузки в XML (создаются только некоторые реквизиты, отражающие все случае заполнения файла) и схемы XSD.

    Разархивировать все файлы в некоторую директорию.

    XML будет создаваться в ней же.

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

    Для начала нужно разобраться в том, что значит XSD-схема, чтобы понять, чему именно ваш файл не соответствует.

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

    Получается, что XSD-схема- это описание структуры вашего отчета , выполненное на одном из языков программирования. Если в отчет будет внесена неверная информация, то для схемы она будет просто нечитаема, именно поэтому система выдает ошибку о том, что файл не соответствует XSD-схеме.

    Это говорит о том, что информация, которую вы ввели, не может быть прочитана на языке программирования, следовательно, программа признает ее неверной.

    Стоит отметить, что данная проблема может возникнуть как из-за неверно введенных данных (например, вы ошиблись, когда вводили ИНН организации), так и из-за неверного формата введения данных (например, вы указали лишние пробелы или дефисы).

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

    Для того чтобы решить ошибку в XSD-схеме, вам необходимо будет проверить правильность всех данных, которые вы ввели,а также уточнить, не выходило ли обновление программы, в которой вы работаете. Однако, прежде, чем проверять файл, внимательно посмотрите на текст ошибки, которую вам выдает.

    Дело в том, что в некоторых ситуациях после текста о том, что файл не соответствует схеме, стоит двоеточие и далее указывается причина данной проблемы. Если причина в самой ошибке не указана, обновите программу до самой последней версии.

    Завершив обновление, попробуйте снова отправить ваш отчет. Если после обновления файл опять выдает ошибку, значит необходимо искать проблему в нем. Если вы работаете в программе 1С, то вы можете проверить файл с помощью специальной кнопки, которая называется «проверить в интернете».

    Если два предыдущих пункта не помогли выявить вам проблему, то проверьте, все ли обязательные поля вы заполнили, правильно ли вы ввели все данные, ведь многие из них необходимо заполнять цифрами, в таком случае очень легко допустить опечатку.

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

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

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

    Итак, если вы пытаетесь отправить отчет в налоговый орган, но файл выдает ошибку о том, что он не соответствует XSD-схеме, это значит, что ваш отчет не может быть отправлен, так как программа не может прочитать данные, которые вы ввели.

    Но поддаваться панике не стоит, ведь в большинстве случаев эта проблема решается достаточно просто и быстро. К тому же если отчет вы отправили вовремя, но он не был принят из-за неверного формата, то налоговая не имеет права штрафовать вас за не вовремя предоставленный отчет. В первую очередь, обратите внимание на сам текст ошибки, возможно, там уже указана причина ее возникновения.

    По-сути, причин может быть всего две. Или у вас на устройстве установлена старая версия программы , с помощью которой вы делаете отчет, в таком случае решить проблему легко, нужно просто загрузить самое последнее обновление, обычно его можно найти на сайте программы, которую вы используете. Второй причиной может быть то, что вы неверно заполнили какие-то данные, или вообще не заполнили какое-либо поле.

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

    В этой главе будет показано, как написать XML-схемы. Вы также узнаете, что схема может быть записана по-разному.

    Документа XML

    Давайте посмотрим на этот XML - документ под названием "shiporder.xml" :

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="shiporder.xsd">
    John Smith

    Ola Nordmann

    Langgt 23

    4000 Stavanger
    Norway


    Empire Burlesque
    Special Edition
    1
    10.90


    Hide your heart
    1
    9.90

    Документ XML выше состоит из корневого элемента, "shiporder" , который содержит обязательный атрибут под названием "orderid" . "shiporder" элемент содержит три различных дочерних элемента: "orderperson" , "shipto" и "item" . "item" элемент появляется дважды, и он содержит "title" , необязательный "note" элемент, "quantity" , и "price" элемент.

    Линия выше: Xmlns: XSI = "http://www.w3.org/2001/XMLSchema-instance" говорит XML-анализатору, что этот документ должен быть проверен на схеме. Линия: XSI: noNamespaceSchemaLocation = "shiporder.xsd" указывает, где находится схемы что и (here it is in the same folder as "shiporder.xml") .

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

    Теперь мы хотим создать схему для документа XML выше.

    Мы начнем с открытия нового файла, который мы будем называть "shiporder.xsd" . Для того, чтобы создать схему мы могли бы просто следовать структуре в документе XML и определите каждый элемент, как мы находим его. Мы начнем со стандартной декларации XML с последующим хз: элемент схемы, который определяет схему:



    ...

    В схеме выше мы используем стандартные пространства имен (xs) , и URI , связанный с этим пространством имен является определение языка схемы, который имеет стандартное значение http://www.w3.org/2001/XMLSchema.

    Далее, мы должны определить "shiporder" элемент. Этот элемент имеет атрибут и содержит другие элементы, поэтому мы рассматриваем его как сложный тип. Дочерние элементы "shiporder" элемент окружен хз: элемент последовательности, которая определяет упорядоченную последовательность субэлементов:




    ...


    Затем мы должны определить "orderperson" элемент в качестве простого типа (так как она не содержит каких - либо атрибутов или других элементов). В типа (xs:string) с префиксом префикс пространства имен, связанного с XML - схемы, которая указывает заранее определенный тип данных схемы:










    С помощью схем, которые мы можем определить количество возможных появлений для элемента с MaxOccurs и атрибутами MinOccurs. MaxOccurs определяет максимальное число вхождений для элемента и MinOccurs определяет минимальное число вхождений для элемента. Значение по умолчанию для обоих MaxOccurs и MinOccurs 1!

    Теперь мы можем определить "item" элемент. Этот элемент может появляться несколько раз внутри "shiporder" элемента. Это определяется установкой maxOccurs атрибут "item" элемента "unbounded" , что означает, что там может быть много вхождений "item" элемент, как автор хочет. Обратите внимание на то, что "note" элемент не является обязательным. Мы определили это, установив minOccurs атрибут к нулю:










    Теперь мы можем объявить атрибут "shiporder" элемента. Поскольку это обязательный атрибут мы указываем использование = "требуется".

    Note: Заявления атрибутов всегда должны прийти в последний раз:

    Вот полный список файла схемы под названием "shiporder.xsd" :





























    Разделите схемы

    Предыдущий метод дизайн очень прост, но может быть трудно читать и поддерживать, когда документы являются сложными.

    Следующий метод дизайн основан на определении всех элементов и атрибутов, а затем ссылаясь на них, используя ref атрибут.

    Вот новый дизайн файла схемы ("shiporder.xsd") :








































    Использование именованных типов

    Способ третий дизайн определяет классы или типы, что позволяет повторно использовать определения элементов. Это делается путем именования элементов simpleTypes и complexTypes, а затем указать на них через type атрибута элемента.

    Вот уже третий дизайн файла схемы ("shiporder.xsd") :

































    Элемент ограничение указывает на то, что тип данных был получен из пространства имен типа данных XML-схемы W3C. Таким образом, следующий фрагмент означает, что значение элемента или атрибута должно быть значение строки:

    Элемент ограничение чаще используется, чтобы применить ограничения к элементам. Посмотрите на следующие строки из приведенной выше схеме:





    Это указывает на то, что значение элемента или атрибута должно быть строкой, оно должно быть ровно шесть символов в строке, и эти символы должны быть числом от 0 до 9.