Добрый день!
Есть файлик xml

```1c
    <AxaptaXMLExport xmlns:Table="urn:www.navision.com/Formats/Table" version="1.0">
    <transaction version="1.0">
    <Table:Record name="InventTableExportDC" row="1">
    <Table:Field name="ItemId">00099B101</Table:Field>
    <Table:Field name="FactoryId_OK">Остальные</Table:Field>
    <Table:Field name="FactoryItemId">ББ00017-55555</Table:Field>
    <Table:Field name="itemName">ШОКОЛАД_Бабаевский_горький_111111111111</Tab­le:Field>
    <Table:Field name="NetWeight">5.120</Table:Field>
    <Table:Field name="Quantity">200.00</Table:Field>
    <Table:Field name="UnitId">шт</Table:Field>
    <Table:Field name="UnitVolume"/>
    <Table:Field name="grossDepth">387.00</Table:Field>
    <Table:Field name="grossHeight">82.00</Table:Field>
    <Table:Field name="grossWidth">282.00</Table:Field>
    <Table:Field name="standardPalletQuantity">800.00</Table:Field>
    <Table:Field name="QtyPerLayer">8.00</Table:Field>
    <Table:Field name="ABCRevenue"/>
    <Table:Field name="Price">0</Table:Field>
    <Table:Field name="applicationtime_OK">365</Table:Field>
    <Table:Field name="FactoryNE">ББ00017B101</Table:Field>
    <Table:Field name="standardShowBoxQuantity">50.00</Table:Field>
    </Table:Record>
    </transaction>
    </AxaptaXMLExport>
```

Генерирую по нему схему xsd при помощи проги Oxygen XML.
Получаю 2 файлика:

```1c
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:www.navision.com/Formats" elementFormDefault="qualified" xmlns:Table="urn:www.navision.com/Formats/Table">
    <xs:import namespace="urn:www.navision.com/Formats/Table" schemaLocation="Table.xsd"/>
    <xs:element name="AxaptaXMLExport">
    <xs:complexType>
    <xs:sequence>
    <xs:element ref="transaction"/>
    </xs:sequence>
    <xs:attribute name="version" use="required" type="xs:decimal"/>
    </xs:complexType>
    </xs:element>
    <xs:element name="transaction">
    <xs:complexType>
    <xs:sequence>
    <xs:element maxOccurs="unbounded" ref="Table:Record"/>
    </xs:sequence>
    <xs:attribute name="version" use="required" type="xs:decimal"/>
    </xs:complexType>
    </xs:element>
    </xs:schema>
```

И

```1c
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:www.navision.com/Formats/Table" xmlns:Table="urn:www.navision.com/Formats/Table">
    <xs:import schemaLocation="InventTable_19092013.xsd"/>
    <xs:element name="Record">
    <xs:complexType>
    <xs:sequence>
    <xs:element maxOccurs="unbounded" ref="Table:Field"/>
    </xs:sequence>
    <xs:attribute name="name" use="required" type="xs:NCName"/>
    <xs:attribute name="row" use="required" type="xs:integer"/>
    </xs:complexType>
    </xs:element>
    <xs:element name="Field" >
    <xs:complexType mixed="true">

    <xs:attribute name="name" use="required" type="xs:NCName"/>

    </xs:complexType>
    </xs:element>
    </xs:schema>
```

Импортирую в дерево метаданных конфы как Пакет XDTO.
После этого вот таким кодом пытаюсь загрузить исходный xml-файл

```1c
    Схемы = Новый Массив;
    Схемы.Добавить("C:\Темр\схема1.xsd");
    Схемы.Добавить("C:\Темр\схема2.xsd");
    Пакеты = Новый Массив;
    П_1= ФабрикаXDTO.Пакеты.Получить("urn:www.navision.com/Formats");
    П_2= ФабрикаXDTO.Пакеты.Получить("urn:www.navision.com/Formats/Table");

    Пакеты.Добавить(П_1);
    Пакеты.Добавить(П_2);

    Фабрика = СоздатьФабрикуXDTO(Схемы, Пакеты);

    ОбменXML = Новый ЧтениеXML;
    ОбменXML.ОткрытьФайл(ИмяФайла);
    ОбъектГлавный = Фабрика.ПрочитатьXML(ОбменXML);

    Для Каждого Объект1 Из ОбъектГлавный.transaction.Record Цикл
    ОбработкаПрерыванияПользователя();
    Для Каждого Объект2 Из Объект1.Field Цикл
    Сообщить(Объект2);
    //считывание текстового содержимого... как?
    КонецЦикла;
    КонецЦикла;

    ФайлОбмена = ";
    ОбменXML.Закрыть();
```

Однако Объект2 типа ОбъектXDTO не содержит текстового содержимого. Там только атрибуты.
Как добраться до данных? Вразумите! :)
Спасибо.
---
Как вариант можно еще использовать xPath и/или xsl
Вот ссылка на цикл статей

```1c
    ОбменXML = Новый ЧтениеXML;
    ОбменXML.ОткрытьФайл("D:\Новый1.xml");
    ПостроительДОМ = Новый ПостроительDOM;
    ДокументДом = ПостроительДОМ.Прочитать(ОбменXML);
    Результат = ДокументДом.ВычислитьВыражениеXPath("/AxaptaXMLExport/transaction/Table:Record/Table:Field", ДокументДом, Новый РазыменовательПространствИменDOM(ДокументДом), ТипРезультатаDOMXPath.УпорядоченныйИтераторУзлов);
    Пока Истина Цикл
    Значение = Результат.ПолучитьСледующий();
    Если Значение = Неопределено Тогда
    Прервать;
    КонецЕсли;
    Сообщить(Значение.Атрибуты.ПолучитьИменованныйЭлемент("name").ЗначениеУзла + " = " + Значение.ТекстовоеСодержимое);
    КонецЦикла;
```
---
10 $m
---
Где-же, где советы-советики? Гуглить и курить не предлагать! :)
---
Схема1

```1c
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:www.navision.com/Formats" elementFormDefault="qualified" xmlns:Table="urn:www.navision.com/Formats/Table">
    <xs:import namespace="urn:www.navision.com/Formats/Table" schemaLocation="Схема2.xsd"/>
    <xs:element name="AxaptaXMLExport">
    <xs:complexType>
    <xs:sequence>
    <xs:element ref="transaction"/>
    </xs:sequence>
    <xs:attribute name="version" use="required" type="xs:decimal"/>
    </xs:complexType>
    </xs:element>
    <xs:element name="transaction">
    <xs:complexType>
    <xs:sequence>
    <xs:element maxOccurs="unbounded" ref="Table:Record"/>
    </xs:sequence>
    <xs:attribute name="version" use="required" type="xs:decimal"/>
    </xs:complexType>
    </xs:element>
    </xs:schema>
```

Схема2

```1c
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:www.navision.com/Formats/Table" xmlns:Table="urn:www.navision.com/Formats/Table">
    <xs:import schemaLocation="Схема1.xsd"/>
    <xs:element name="Record">
    <xs:complexType>
    <xs:sequence>
    <xs:element maxOccurs="unbounded" ref="Table:Field"/>
    </xs:sequence>
    <xs:attribute name="name" use="required" type="xs:NCName"/>
    <xs:attribute name="row" use="required" type="xs:integer"/>
    </xs:complexType>
    </xs:element>
    <xs:element name="Field" >
    <xs:complexType mixed="true">

    <xs:attribute name="name" use="required" type="xs:NCName"/>

    </xs:complexType>
    </xs:element>
    </xs:schema>
```

Текст

```1c
    Схемы = Новый Массив;
    Схемы.Добавить("D:\схема1.xsd");
    Схемы.Добавить("D:\схема2.xsd");

    Фабрика = СоздатьФабрикуXDTO(Схемы);

    ОбменXML = Новый ЧтениеXML;
    ОбменXML.ОткрытьФайл("D:\Новый1.xml");
    ОбъектГлавный = Фабрика.ПрочитатьXML(ОбменXML);

    Для Каждого Объект1 Из ОбъектГлавный.transaction.Record.Field Цикл
    Сообщить(Объект1.name);
    //считывание текстового содержимого... как?
    КонецЦикла;

    ФайлОбмена = ";
    ОбменXML.Закрыть();
```

Т.к. коллекция ОбъектГлавный.transaction содержит всего 1 элемент, то она читается как ОбъектXDTO, а не как СписокXDTO.
---
А, это я просто тут в посте 1 элемент оставил для краткости. Добавлю 2 или сколько угодно, будет СписокXDTO, но это проблему не решает. Мне нужно добраться до текстовых данных... "ШОКОЛАД_Бабаевский_горький_111111111111".
Это не получается.
---
имхо, второй xsd файл генерится неверно. Объявления реквизита для хранения значения элемента то там нет.
---
mymyka,
да, неверно видимо. Но даже если добавить это объявление, то при чтении
ОбъектГлавный = Фабрика.ПрочитатьXML(ОбменXML); (хоть со вторым параметром хоть без) он не читается фабрикой.
---
zaxarovsky, да. Вижу уже, что значения не видны. Мне кажется, что дело в схеме.
---
```1c
    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema id="NewDataSet" xmlns=" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="AxaptaXMLExport">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="transaction" minOccurs="0" maxOccurs="unbounded">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="Record" minOccurs="0" maxOccurs="unbounded">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="Field" nillable="true" minOccurs="0" maxOccurs="unbounded">
    <xs:complexType>
    <xs:simpleContent msdata:ColumnName="Field_Text" msdata:Ordinal="0">
    <xs:extension base="xs:string">
    </xs:extension>
    </xs:simpleContent>
    </xs:complexType>
    </xs:element>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" />
    <xs:attribute name="row" type="xs:string" />
    </xs:complexType>
    </xs:element>
    </xs:sequence>
    <xs:attribute name="version" type="xs:string" />
    </xs:complexType>
    </xs:element>
    </xs:sequence>
    <xs:attribute name="version" type="xs:string" />
    </xs:complexType>
    </xs:element>
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
    <xs:element ref="AxaptaXMLExport" />
    </xs:choice>
    </xs:complexType>
    </xs:element>
    </xs:schema>
```

Но тут другая проблема. Не видно имен полей.
---
```1c
    <AxaptaXMLExport xmlns:Table="urn:www.navision.com/Formats/Table" version="1.0">
    <transaction version="1.0">
    <Table:Record name="InventTableExportDC" row="1">
    <Table:Field name="ItemId">
    <Table:Field>00099B101</Table:Field>
    </Table:Field>
    <Table:Field name="FactoryId_OK">
    <Table:Field>Остальные</Table:Field>
    </Table:Field>
    <Table:Field name="FactoryItemId">
    <Table:Field>ББ00017-55555</Table:Field>
    </Table:Field>
    <Table:Field name="itemName">
    <Table:Field>ШОКОЛАД_Бабаевский_горький_111111111111</Table:Field>
    </Table:Field>
    <Table:Field name="NetWeight">
    <Table:Field>5.120</Table:Field>
    </Table:Field>
    <Table:Field name="Quantity">
    <Table:Field>200.00</Table:Field>
    </Table:Field>
    <Table:Field name="UnitId">
    <Table:Field>шт</Table:Field>
    </Table:Field>
    <Table:Field name="UnitVolume"/>
    <Table:Field name="grossDepth">
    <Table:Field>387.00</Table:Field>
    </Table:Field>
    <Table:Field name="grossHeight">
    <Table:Field>82.00</Table:Field>
    </Table:Field>
    <Table:Field name="grossWidth">
    <Table:Field>282.00</Table:Field>
    </Table:Field>
    <Table:Field name="standardPalletQuantity">
    <Table:Field>800.00</Table:Field>
    </Table:Field>
    <Table:Field name="QtyPerLayer">
    <Table:Field>8.00</Table:Field>
    </Table:Field>
    <Table:Field name="ABCRevenue"/>
    <Table:Field name="Price">
    <Table:Field>0</Table:Field>
    </Table:Field>
    <Table:Field name="applicationtime_OK">
    <Table:Field>365</Table:Field>
    </Table:Field>
    <Table:Field name="FactoryNE">
    <Table:Field>ББ00017B101</Table:Field>
    </Table:Field>
    <Table:Field name="standardShowBoxQuantity">
    <Table:Field>50.00</Table:Field>
    </Table:Field>
    </Table:Record>
    </transaction>
    </AxaptaXMLExport>
```

Вот так нужно оформлять. Иначе не понимает.
---
kasper076,
да? у меня при чтении ФабрикаXDTO.ПрочитатьXML этого файла все-равно нету текстового значения поля.
вы как, каким способом проверяете\загружаете?
---
zaxarovsky,

```1c
    ОбменXML = Новый ЧтениеXML;
    ОбменXML.ОткрытьФайл("D:\Новый1.xml");
    ОбъектГлавный = ФабрикаXDTO.ПрочитатьXML(ОбменXML);
    Для Каждого Объект1 Из ОбъектГлавный.transaction.Record.Field Цикл
    Сообщить(Объект1.name);
    Сообщить(Объект1.Field);
    КонецЦикла;
    ОбменXML.Закрыть();
```
---
Ай, да! Я просто схему новую сгенерил, а файлик xml старый оставил сперва. Да, так доступно текстовое содержимое.
Однако ж, придется каждый файл обмена при загрузке сначала парсить и перезаписывать в этом формате.
Неужто не получится без этого? Это ведь стандартный формат обмена у Аксапты.
Я еще пробовал генерить xsd с помощью Altova XMLSpy. Там схема гораздо полнее формируется, что уже хорошо, но ФабрикаXDTO.ПрочитатьXML все-равно ее не хавает как надо.
---
Проще читать ее через обычное ЧтениеXML, благо структура стойкая и примитивная, а все значения строковые.
---
mymyka,
Знаю, что проще, так и читаем.
Тут вопрос поставлен именно так, чтобы извернуться загрузить через XDTO, да еще и структуру исходного xml не менять. :)
---
zaxarovsky,

```1c
    ОбменXML = Новый ЧтениеXML;
    ОбменXML.ОткрытьФайл("D:\Новый1.xml");
    ПостроительДОМ = Новый ПостроительDOM;
    ДокументДом = ПостроительДОМ.Прочитать(ОбменXML);
    ОбходДереваДОМ = Новый ОбходДереваDOM(ДокументДом);
    Пока ОбходДереваДОМ.СледующийУзел() <> Неопределено Цикл
    Если ОбходДереваДОМ.ТекущийУзел.ТипУзла = ТипУзлаDOM.Текст Тогда
    Продолжить;
    КонецЕсли;
    Сообщить(ОбходДереваДОМ.ТекущийУзел.ИмяЭлемента);
    Сообщить(ОбходДереваДОМ.ТекущийУзел.ТекстовоеСодержимое);
    КонецЦикла;
    ОбменXML.Закрыть();
```

Работает с исходным файлом XML. В отладчике для ОбходДереваДОМ.ТекущийУзел можно увидеть значения атрибутов, ну и соответственно настроить их обработку.
---
В выгрузке нет описания типов, все равно придется вручную присваивать. Разница лишь в том, как организовывать обход. Через ЧтениеXML.Прочитать(), dom или фабрикуxdto.
---
mymyka, согласен. Через Фабрику вот только не выйдет без корректировки исходного файла.
---
kasper076,
похоже на то
---
Вот комбинация XDTO и DOM :)

```1c
    ОбменXML = Новый ЧтениеXML;
    ОбменXML.ОткрытьФайл(ИмяФайла);

    ОбъектГлавный = ФабрикаXDTO.ПрочитатьXML(ОбменXML);
    ОбменXML.Закрыть();

    ОбменXML.ОткрытьФайл(ИмяФайла);
    ПостроительДОМ = Новый ПостроительDOM;
    ДокументДом = ПостроительДОМ.Прочитать(ОбменXML);
    ОбменXML.Закрыть();

    Фильтр = Новый ФильтрУзловDOM(,,,ПараметрыОтбораУзловDOM.ОтображатьТекст);
    ОбходДереваДОМ = Новый ОбходДереваDOM(ДокументДом,, Фильтр);

    Для Каждого Запись Из ОбъектГлавный.transaction.Record Цикл
    Сообщить("**************Запись "+Запись.row+"****************");
    ЕстьСоответствиеАтрибуту = Истина; ИмяАтрибута = "name";
    Для Каждого Поле Из Запись.Field Цикл
    Если ЕстьСоответствиеАтрибуту Тогда ОбходДереваДОМ.СледующийУзел(); КонецЕсли;

    Если ОбходДереваДОМ <> Неопределено И ОбходДереваДОМ.ТекущийУзел.РодительскийУзел.Атрибуты.ПолучитьИменованныйЭлемент(ИмяАтрибута).Значение = Поле[ИмяАтрибута] Тогда
    ТекстовоеЗначение = ОбходДереваДОМ.ТекущийУзел.ТекстовоеСодержимое; ЕстьСоответствиеАтрибуту = Истина;
    Иначе
    ТекстовоеЗначение = "; ЕстьСоответствиеАтрибуту = Ложь;
    КонецЕсли;
    Сообщить(Поле[ИмяАтрибута]+"-----------"+ТекстовоеЗначение ); //получаем значение текстового содержимого
    КонецЦикла;
    КонецЦикла;
```

во вложении файлик для загрузки
---
выводы:
1. Схема xsd не обязательна (так же как и кастомные ПакетыXDTO) при загрузке xml через ФабрикуXDTO.
2. При чтении через Фабрику не все структуры формата xml поддерживаются. Например в данном примере не читаются одновременно и атрибуты и текстовое содержимое элемента.
3. На помощь может прийти ПостроительDOM. Там структура документа загружается полностью.

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

```1c
    ОбменXML = Новый ЧтениеXML;
    ОбменXML.ОткрытьФайл("D:\Новый1.xml");
    ПостроительДОМ = Новый ПостроительDOM;
    ДокументДом = ПостроительДОМ.Прочитать(ОбменXML);
    Результат = ДокументДом.ВычислитьВыражениеXPath("/AxaptaXMLExport/transaction/Table:Record/Table:Field", ДокументДом, Новый РазыменовательПространствИменDOM(ДокументДом), ТипРезультатаDOMXPath.УпорядоченныйИтераторУзлов);
    Пока Истина Цикл
    Значение = Результат.ПолучитьСледующий();
    Если Значение = Неопределено Тогда
    Прервать;
    КонецЕсли;
    Сообщить(Значение.Атрибуты.ПолучитьИменованныйЭлемент("name").ЗначениеУзла + " = " + Значение.ТекстовоеСодержимое);
    КонецЦикла;
```
---
kasper076,
О, супер! Не знал об этих возможностях, штука вообще полезная, спасибо! :)

P.S. Кстати, если кто будет использовать конструктор Новый ОбходДереваDOM с фильтром, то там параметр типа ФильтрУзловDOM надо указывать третьим по счету, а не вторым, как указано в синтаксис-помощнике (почему-то это так).
---
kasper076,
Спасибо за помощь! Думаю, вся полученная в ходе обсуждения информация пригодится не только мне!