Имя: Пароль:
1C
 
8.2 Сериализировать в xml файл в структуру
0 invest
 
03.02.16
14:10
Доброго времени суток.

Коллеги подскажите как можно загрузить хмл файл следующего вида в структуру.

<?xml version="1.0" encoding="UTF-8"?>
<Orders>
    <Item>
        <Number>О20К-000433</Number>
        <Date>2016-01-26T17:54:14</Date>
        <Object>1d2851a9-c35b-11e5-a659-6cf04904b899</Object>
        <Customer>6493917f-3796-11e1-8032-6cf04904b899</Customer>
        <Comment/>
        <Invoice>false</Invoice>
        <Deliver>2016-01-27T00:00:00</Deliver>
        <Manager>e242745a-c261-11e1-af33-4487fc8cb1a5</Manager>
        <Rows>
            <Item>
                <Object>1d2851a9-c35b-11e5-a659-6cf04904b899</Object>
                <Product>95e4caa3-1e62-11e4-a622-6cf04904b899</Product>
                <Amount>5</Amount>
            </Item>
            <Item>
                <Object>1d2851a9-c35b-11e5-a659-6cf04904b899</Object>
                <Product>9d9c0167-1e69-11e4-a622-6cf04904b899</Product>
                <Amount>5</Amount>
            </Item>
            <Item>
                <Object>1d2851a9-c35b-11e5-a659-6cf04904b899</Object>
                <Product>9d9c0182-1e69-11e4-a622-6cf04904b899</Product>
                <Amount>3</Amount>
            </Item>
        </Rows>
    </Item>
</Orders>
1 Рэйв
 
03.02.16
14:19
в дерево складывай.Зачем тебе структура?
2 invest
 
03.02.16
14:20
(1) есть примерчик как в дерево складывать?
3 Рэйв
 
03.02.16
14:20
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлу);

Пока Чтение.Прочитать() Цикл

    // Прочитать "структурные части" элементов.
    // Проверить, какая часть элемента - текущая.
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
        ИмяУзла = Чтение.Имя; Сообщить("--" + ИмяУзла);

        // Атрибуты элементов можно читать только если текущая часть -
        // начало элемента
        Пока Чтение.ПрочитатьАтрибут() Цикл

            // Прочитать данные узла атрибута.
            ТипУзла = Чтение.ТипУзла;
            Имя = Чтение.Имя;
            Значение = Чтение.Значение;

            // Обработать полученные значения.

        КонецЦикла;

    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда

        // В примере просто выводим текст в окно сообщений.
        Сообщить("Текст:" + Чтение.Значение);

    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда

        // В примере просто выводим признак конца элемента
        // в окно сообщений Сообщить("--Конец:" + Чтение.Имя);

    КонецЕсли;

КонецЦикла;
(С)Габец
4 Рэйв
 
03.02.16
14:21
в узлах добавляй ветки
5 invest
 
03.02.16
14:21
(3) благодарю, но подобный метод мне знаком. Может есть что проще?
6 Serginio1
 
03.02.16
14:22
Чиай через ФабрикаXDTO
7 Serginio1
 
03.02.16
14:26
ЧтениеXML=Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
ЧтениеXML.ПерейтиКСодержимому();

Имя=ЧтениеXML.Имя;
ОбъектXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,Имя));

Просто будет читать как AnyType
8 Живой Ископаемый
 
03.02.16
14:32
И еще вот такой ХМЛ прочитается в дерево:

=====
<ValueTree xmlns="http://v8.1c.ru/8.1/data/core"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">;
    <column>
        <Name xsi:type="xs:string">Поле1</Name>
        <ValueType>
            <Type>xs:string</Type>
            <Type>Null</Type>
            <StringQualifiers>
                <Length>6</Length>
                <AllowedLength>Variable</AllowedLength>
            </StringQualifiers>
        </ValueType>
        <Title>Поле1</Title>
        <Width xsi:type="xs:decimal">6</Width>
    </column>
    <column>
        <Name xsi:type="xs:string">Поле2</Name>
        <ValueType>
            <Type>Null</Type>
            <Type>xs:decimal</Type>
            <NumberQualifiers>
                <Digits>0</Digits>
                <FractionDigits>0</FractionDigits>
                <AllowedSign>Any</AllowedSign>
            </NumberQualifiers>
        </ValueType>
        <Title>Поле2</Title>
        <Width xsi:type="xs:decimal">32</Width>
    </column>
    <row>
        <row>
            <row>
                <Value xsi:type="xs:string">Первое</Value>
                <Value xsi:type="xs:decimal">3</Value>
            </row>
            <row>
                <Value xsi:type="xs:string">Первое</Value>
                <Value xsi:type="xs:decimal">8</Value>
            </row>
            <Value xsi:type="xs:string">Первое</Value>
            <Value xsi:type="xs:decimal">11</Value>
        </row>
        <row>
            <row>
                <Value xsi:type="xs:string">Второе</Value>
                <Value xsi:type="xs:decimal">18</Value>
            </row>
            <row>
                <Value xsi:type="xs:string">Второе</Value>
                <Value xsi:type="xs:decimal">38</Value>
            </row>
            <Value xsi:type="xs:string">Второе</Value>
            <Value xsi:type="xs:decimal">56</Value>
        </row>
        <Value xsi:type="Null"/>
        <Value xsi:type="xs:decimal">67</Value>
    </row>
    <row>
        <row>
            <Value xsi:type="xs:string">Первое</Value>
            <Value xsi:type="xs:decimal">3</Value>
        </row>
        <row>
            <Value xsi:type="xs:string">Первое</Value>
            <Value xsi:type="xs:decimal">8</Value>
        </row>
        <Value xsi:type="xs:string">Первое</Value>
        <Value xsi:type="xs:decimal">11</Value>
    </row>
    <row>
        <row>
            <Value xsi:type="xs:string">Второе</Value>
            <Value xsi:type="xs:decimal">18</Value>
        </row>
        <row>
            <Value xsi:type="xs:string">Второе</Value>
            <Value xsi:type="xs:decimal">38</Value>
        </row>
        <Value xsi:type="xs:string">Второе</Value>
        <Value xsi:type="xs:decimal">56</Value>
    </row>
</ValueTree>
====

http://screencast.com/t/XgymKd3qMg
9 invest
 
03.02.16
14:45
(7) довольно таки интересный код, буду изучать. Всем спасибо.
10 Serginio1
 
03.02.16
14:45
7+ Если, что например в БП3 в модуле ОбменДаннымиXDTOСервер есть функция
ОбъектXDTOВСтруктуру
11 invest
 
03.02.16
14:52
(10) прогал файл через твой код и в отладчики вижу что ОбъектXDTO.Item.Rows не возвращает коллекцию там только один Item. Это как можно понять?
12 invest
 
03.02.16
14:55
(11) тупанул, разобрался. ОбъектXDTO.Item.Rows.Item тут коллекция сидит
13 Serginio1
 
03.02.16
15:01
(12) Кстати не пользуешься Помощь с Web сервисом
14 Spieluhr
 
05.02.16
10:09
(10) У меня аналогичная задача есть и функция ОбменДаннымиXDTOСервер.ОбъектXDTOВСтруктуру() выдает ошибку при обращении к строкам таблицы

{ОбщийМодуль.ОбменДаннымиXDTOСервер.Модуль(3033)}: Ошибка при вызове метода контекста (ПолучитьXDTO)
    ЗначениеXDTO = Источник.ПолучитьXDTO(Свойство);
по причине:
Несоответствие свойства и элемента данных XDTO:
Свойство: 'Row'
Свойство является списковым

Вот кусок файла xml:

<Components>
    <Row>
        <ComponentNumber>25</ComponentNumber>
        <ComponentQtyPlan>365.00000</ComponentQtyPlan>
        <ComponentQtyFact>352.38400</ComponentQtyFact>
    </Row>
    <Row>
        <ComponentNumber>147</ComponentNumber>
        <ComponentQtyPlan>850.00000</ComponentQtyPlan>
        <ComponentQtyFact>884.50000</ComponentQtyFact>
    </Row>
</Components>

Писать обход свойств объекта XDTO в цикле?
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.