Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 18:08

Сериализация XML в XDTO

Автор Ромашев Алексей, 19 янв 2016, 21:44

0 Пользователей и 1 гость просматривают эту тему.

Ромашев Алексей

Поскольку предыдущий мой вопрос был либо слишком сложным, либо очень запутанным я решил его перефразировать. Допустим есть переменная с типом строка, в ней содержится текст XML. Вот пример:
ТекстXML = "<?xml version="1.0"?>
<xs:schema xmlns:tns="http://www.livtorg.org" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.livtorg.org" attributeFormDefault="unqualified" elementFormDefault="qualified">
    <xs:complexType name="Договор">
        <xs:sequence>
            <xs:element name="УИд" type="xs:string"/>
            <xs:element name="Код" type="xs:string"/>
            <xs:element name="Наименование" type="xs:string" nillable="true"/>
            <xs:element name="Родитель" type="xs:string"/>
            <xs:element name="СуммаЗадолженности" type="xs:decimal" nillable="true"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Заказ">
        <xs:sequence>
            <xs:element name="НомерДок" type="xs:string"/>
            <xs:element name="ДатаДок" type="xs:dateTime"/>
            <xs:element name="КодКонтрагента" type="xs:string"/>
            <xs:element name="КодДоговора" type="xs:string"/>
            <xs:element name="ТабТовары" type="tns:ЗаказТовары" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ЗаказТовары">
        <xs:sequence>
            <xs:element name="КодНоменклатуры" type="xs:string"/>
            <xs:element name="Количество" type="xs:decimal"/>
            <xs:element name="Цена" type="xs:decimal"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Заказы">
        <xs:sequence>
            <xs:element name="СписокЗаказов" type="tns:Заказ" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Контрагент">
        <xs:sequence>
            <xs:element name="УИд" type="xs:string"/>
            <xs:element name="Код" type="xs:string"/>
            <xs:element name="Наименование" type="xs:string" nillable="true"/>
            <xs:element name="СписокДоговоров" type="tns:Договор" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Номенклатура">
        <xs:sequence>
            <xs:element name="УИд" type="xs:string"/>
            <xs:element name="Код" type="xs:string"/>
            <xs:element name="Наименование" type="xs:string" nillable="true"/>
            <xs:element name="Родитель" type="xs:string" nillable="true"/>
            <xs:element name="ЭтоГруппа" type="xs:boolean"/>
            <xs:element name="ЕдиницаДляОтчетов" type="xs:string" nillable="true"/>
            <xs:element name="КоэффициентЕДО" type="xs:decimal" nillable="true"/>
            <xs:element name="ЕдиницаХраненияОстатков" type="xs:string" nillable="true"/>
            <xs:element name="КоэффициентЕХО" type="xs:decimal" nillable="true"/>
            <xs:element name="Цена" type="xs:decimal" nillable="true"/>
            <xs:element name="Остатки" type="xs:decimal" nillable="true"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="СписокКонтрагентов">
        <xs:sequence>
            <xs:element name="Контрагенты" type="tns:Контрагент" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="СписокТоваров">
        <xs:sequence>
            <xs:element name="Номенклатура" type="tns:Номенклатура" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>";

Можно ли из неё получить XDTO пакет, объект или что угодно?)

vitasw

Только в том случае, если объекты присутствуют как метаданные в вашей конфигурации. В противном случае разбирать как обычный xml.

Ромашев Алексей

Цитата: vitasw от 19 янв 2016, 23:35
Только в том случае, если объекты присутствуют как метаданные в вашей конфигурации. В противном случае разбирать как обычный xml.
Можете скинуть ссылку на пример? я видел как разбирают файлы XML, но как разобрать строку не знаю(

Rasty

Цитата: vitasw от 19 янв 2016, 23:35
Только в том случае, если объекты присутствуют как метаданные в вашей конфигурации. В противном случае разбирать как обычный xml.
вчитайтесь
Добавлено: 20 янв 2016, 10:28


а если вы хотите разобрать , то тут вы писали

    НаборСхемXML = ФабрикаXDTO.ЭкспортСхемыXML("http://www.livtorg.org");
     Для Счетчик = 0 по НаборСхемXML.Количество() - 1 Цикл
            Схема = НаборСхемXML.Получить(Счетчик);
            Схема.ОбновитьЭлементDOM();
            ЗаписьDOM = Новый ЗаписьDOM;
            ЗаписьXMLСтрока = Новый ЗаписьXML;
            ЗаписьXMLСтрока.УстановитьСтроку();
            ЗаписьXMLФайл = Новый ЗаписьXML;
            ЗаписьDOM.Записать(Схема.ДокументDOM, ЗаписьXMLСтрока);
            ЗаписьXMLФайл.УстановитьСтроку();
            ЗаписьXMLФайл.ЗаписатьБезОбработки(ЗаписьXMLСтрока.Закрыть());
           
        КонецЦикла;
        ЧТ= ЗаписьXMLФайл.Закрыть() ;
        ЧТХЗ= Новый ХранилищеЗначения(ЧТ, Новый СжатиеДанных(9));
    Возврат ЧТХЗ;

Цитировать
Который возвращает Хранилище значений, в котором находится XML
по идеи вопросы должны отпадать
Помогли - Скажи спасибо! Решил сам - поделись решением!
:)

Ромашев Алексей

Цитата: Rasty от 20 янв 2016, 10:19
Цитата: vitasw от 19 янв 2016, 23:35
Только в том случае, если объекты присутствуют как метаданные в вашей конфигурации. В противном случае разбирать как обычный xml.
вчитайтесь
Добавлено: 20 янв 2016, 10:28


а если вы хотите разобрать , то тут вы писали

    НаборСхемXML = ФабрикаXDTO.ЭкспортСхемыXML("http://www.livtorg.org");
     Для Счетчик = 0 по НаборСхемXML.Количество() - 1 Цикл
            Схема = НаборСхемXML.Получить(Счетчик);
            Схема.ОбновитьЭлементDOM();
            ЗаписьDOM = Новый ЗаписьDOM;
            ЗаписьXMLСтрока = Новый ЗаписьXML;
            ЗаписьXMLСтрока.УстановитьСтроку();
            ЗаписьXMLФайл = Новый ЗаписьXML;
            ЗаписьDOM.Записать(Схема.ДокументDOM, ЗаписьXMLСтрока);
            ЗаписьXMLФайл.УстановитьСтроку();
            ЗаписьXMLФайл.ЗаписатьБезОбработки(ЗаписьXMLСтрока.Закрыть());
           
        КонецЦикла;
        ЧТ= ЗаписьXMLФайл.Закрыть() ;
        ЧТХЗ= Новый ХранилищеЗначения(ЧТ, Новый СжатиеДанных(9));
    Возврат ЧТХЗ;

Цитировать
Который возвращает Хранилище значений, в котором находится XML
по идеи вопросы должны отпадать
Это был исходник другого программиста. Я вроде как разобрался, только теперь возникла проблема. При исполнении этого кода:
ЧтениеXMLСхемы = Новый ЧтениеXML;
СтрокаXSD = ПолучитьСтрокуЗаказа();
ЧтениеXMLСхемы.УстановитьСтроку(СтрокаXSD);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXMLСхемы);
ПостроительСхемXML = Новый ПостроительСхемXML;
СхемаXML = ПостроительСхемXML.СоздатьСхемуXML(ДокументDOM);
НаборСхемXML = Новый НаборСхемXML;
НаборСхемXML.Добавить(СхемаXML);

СвояФабрикаXDTO = Новый ФабрикаXDTO(НаборСхемXML);
ТипЗаказXDTO =  СвояФабрикаXDTO.Тип("http://www.livtorg.org","Заказы");
ЗаказыXDTO = СвояФабрикаXDTO.ПрочитатьXML(ЧтениеXMLСхемы,ТипЗаказXDTO);

Вылетает ошибка:
{Документ.Заказы.Форма.ФормаСписка.Форма(45)}: Ошибка при вызове метода контекста (ПрочитатьXML)
   ЗаказыXDTO = СвояФабрикаXDTO.ПрочитатьXML(ЧтениеXMLСхемы,ТипЗаказXDTO);
по причине:
Ошибка структуры данных XDTO

vitasw

Цитата: Ромашев Алексей от 20 янв 2016, 11:55Ошибка структуры данных XDTO
Структура заказа в xml файле, не совпадает со структурой заказа в вашей конфигурации, поэтому получаете ошибку при автопреобразовании. Разгребайте как обычный xml. Строка отлично записывается в файл с любым расширением.

Похожие темы (5)

Рейтинг@Mail.ru

Поиск