Чтение XML с помощью DXTO. Как программно, не создавая в конфигурации пакетов XDTO, обойти проблему наличия в XML типов данных?

1. user1312100 233 12.04.23 07:29 Сейчас в теме
Здравствуйте.
Пытаюсь прочитать XML файл:
XML


Читаю так:
Фабрика=Новый ФабрикаXDTO;
    
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбораФайла.Заголовок = "Выберите:";
    Если ДиалогВыбораФайла.Выбрать() Тогда
        ИмяФайла = ДиалогВыбораФайла.ПолноеИмяФайла;
    Иначе
        Возврат
    КонецЕсли;
    Чтение = Новый ЧтениеXML;
    Текст = Новый ЧтениеТекста(ИмяФайла,"UTF-8");
    Строка = Текст.Прочитать();
    
    Чтение.УстановитьСтроку(Строка);

    
    ОбXDTO=Фабрика.ПрочитатьXML(Чтение,ТипФабрики);
Показать


Получаю ошибку.

1с ругается на тип. Конечно, из текста XML можно удалить все вхождения " xsi:type=...". И все тогда прекрасно работает. Но это относительно долго по времени выполнения при большой куче подобных файлов.

И потому вопрос, а можно ли прочесть такой файл с помощью XDTO не изменяя текст файла и не создавая в конфигурации пакетов XDTO, так как конфа типовая, не создавая xsd,так как структура файлов разная?

Например, добавив тип "anyType", у меня получилось "проскочить" узел DocumentObject.РеализацияТоваровУслуг: с первым xsi:type=

Добавлял так:

ТипФабрики = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema","anyType");
ОбXDTO=Фабрика.ПрочитатьXML(Чтение,ТипФабрики);


Но вот уже на узле <Сделка xsi:type="DocumentRef.ЗаказПокупателя">957baa9b-87fc-11ed-8492-ac1f6bc59127</Сделка> все равно выпадает в ошибку....

Как программно, не создавая в конфигурации пакетов XDTO, обойти проблему наличия в XML типов данных?
Найденные решения
14. user1312100 233 12.04.23 10:14 Сейчас в теме
(12)Лучше тогда уж заменить так:
Строка = СтрЗаменить(Строка, "xsi:type", "xmlns:abcd");
abcd - может быть любым бредом. Тогда данные по Сделке останутся неизменными. Но DOM в этом случае мне показался быстрее.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 81 12.04.23 08:00 Сейчас в теме
(1)подключить схему из файла *.xsd - это по-сути тот же ПакетXDTO
3. user1312100 233 12.04.23 08:16 Сейчас в теме
(2)Z Я писал, что файлы разные, заранее схема неизвестна. Кроме того, возникнет другой вопрос, а как эту схему создавать, а как подключать, а как не убить файловую систему миллионом *.xsd и прочее...
То есть вместо одного вопроса появится несколько других....

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

Как добавить тип фабрике или настроить фабрику, чтобы XML проглатывался фабрикой без ошибок? При этом меня устроит, что фактически типы при этом у узлов пропадут и они станут строкой, то есть anyType
4. laperuz 47 12.04.23 08:21 Сейчас в теме
(3)Если типы не важны, зачем тогда XDTO? Читайте через DOM, он эту XML прекрасно проглатывает,
6. user1312100 233 12.04.23 08:28 Сейчас в теме
(4)Через DOM пока и сделал. Но там разбор несколько геморойный, Конечный XDTO проще разбирать, да и просто, хотелось бы освоить XDTO. Потому. вопрос прежний...
8. laperuz 47 12.04.23 08:30 Сейчас в теме
(6)А вы как разбираете? Через XPath работать с DOM довольно-таки приятно, т.к. уходим от необходимости последовательного чтения узлов.
10. user1312100 233 12.04.23 08:51 Сейчас в теме
(8)Да и без XPath все довольно просто:
СуммаДокумента = ЧтениеDOM.ПолучитьЭлементыПоИмени("СуммаДокумента")[0].ТекстовоеСодержимое;

И с ним тоже...
Только вот для XDTO это будет элементарно:
СуммаДокумента = ОбXDTO.СуммаДокумента

Что намного приятнее.
В общем есть желание разобрать в этом страшном звере XDTO...

Вопрос лишь уперся в наличие типов XML файла. Без них - все радужно и легко...
5. nomad_irk 81 12.04.23 08:27 Сейчас в теме
(3)Никак. Если типы данных не нужны, читайте XML с помощью DOM или просто как XML - получится некий ОбъектXDTО
7. user1312100 233 12.04.23 08:29 Сейчас в теме
(5)Вот как мне получить ОбъектXDTО не выпав в ошибку:
{ВнешняяОбработка.ВнешняяОбработка2.Форма.Форма.Форма(32)}: Ошибка при вызове метода контекста (ПрочитатьXML)
ОбXDTO=Фабрика.ПрочитатьXML(Чтение,ТипФабрики);
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://www.w3.org/2001/XMLSchema}anyType - [30,24]
Проверка дополнительного свойства:
форма: Элемент
имя: Сделка
по причине:
Тип свойства неопределен
Квалифицированное имя типа: 'DocumentRef.ЗаказПокупателя'
по причине:
Ошибка отображения пространства имен
Отсутствует отображение для префикса: ''
Показать


У меня просто не получается получить ОбъектXDTО
11. user1312100 233 12.04.23 09:09 Сейчас в теме
(9)С этой статьи и начинал. Четвертый метод вывалится в ошибку при чтении, так как не знает тип DocumentRef.ЗаказПокупателя. Пятый тоже, так как нет пакета Приходы, Шестой - нет универсальности, на следующем XML структура иная...
12. laperuz 47 12.04.23 09:27 Сейчас в теме
(11)Костыльный костыль - сделать СтрЗаменить(ВашXML, "xsi:type", "test").
user1312100; Alexwarsis; +2 Ответить
13. user1312100 233 12.04.23 09:40 Сейчас в теме
(12)Об этом я писал в самом начале. Так можно делать, так делал, работает... Правда я удалял полностью тип, а предложенный Вами вариант, подразумевает потерю данных, например, по узлу Сделка.
Вопрос все же звучал: ...а можно не меняя текст XML...?
14. user1312100 233 12.04.23 10:14 Сейчас в теме
(12)Лучше тогда уж заменить так:
Строка = СтрЗаменить(Строка, "xsi:type", "xmlns:abcd");
abcd - может быть любым бредом. Тогда данные по Сделке останутся неизменными. Но DOM в этом случае мне показался быстрее.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот