Вход | Регистрация

1С:Предприятие ::

Метки: 

Разбор XML не стандартного типа.

Я
   flafla
 
22.03.18 - 08:39
Есть XML вот такого вида 
<?xml version="1.0" encoding="UTF-8"?>
    
    <NewRequest>
        <Date>2018-03-21T16:02:49</Date>
        <Number>75</Number>
        <Addr Town="Оренбург" Street="Гагарина Проспект" House="1" Flat="1" />
        <RequestDate>2018-03-30T12:00:00</RequestDate>
        <PhNumber>74564564564</PhNumber>
        <Customer>тест</Customer>
        <Comments>тест</Comments>
    </NewRequest>
    <NewRequest>
        <Date>2018-03-21T16:10:24</Date>
        <Number>76</Number>
        <Addr Town="Оренбург" Street="Гагарина Проспект" House="1" Flat="1" />
        <RequestDate>2018-03-30T12:00:00</RequestDate>
        <PhNumber>74564564564</PhNumber>
        <Customer>тест</Customer>
        <Comments>тест</Comments>
    </NewRequest>
    <NewRequest>
        <Date>2018-03-21T16:11:16</Date>
        <Number>77</Number>
        <Addr Town="Оренбург" Street="Гагарина Проспект" House="1" Flat="1" />
        <RequestDate>2018-03-30T12:00:00</RequestDate>
        <PhNumber>74564564564</PhNumber>
        <Customer>тест</Customer>
        <Comments>тест</Comments>
    </NewRequest>
    <NewRequest>
        <Date>2018-03-21T16:11:33</Date>
        <Number>78</Number>
        <Addr Town="Оренбург" Street="Гагарина Проспект" House="1" Flat="1" />
        <RequestDate>2018-03-30T12:00:00</RequestDate>
        <PhNumber>74564564564</PhNumber>
        <Customer>тест</Customer>
        <Comments>тест</Comments>
    </NewRequest>
    <NewRequest>
        <Date>2018-03-21T16:12:15</Date>
        <Number>79</Number>
        <Addr Town="Оренбург" Street="Гагарина Проспект" House="1" Flat="1" />
        <RequestDate>2018-03-30T12:00:00</RequestDate>
        <PhNumber>74564564564</PhNumber>
        <Customer>тест</Customer>
        <Comments>тест</Comments>
    </NewRequest>
    <NewRequest>
        <Date>2018-03-21T16:12:39</Date>
        <Number>80</Number>
        <Addr Town="Оренбург" Street="Гагарина Проспект" House="1" Flat="1" />
        <RequestDate>2018-03-30T12:00:00</RequestDate>
        <PhNumber>74564564564</PhNumber>
        <Customer>тест</Customer>
        <Comments>тест</Comments>
    </NewRequest>

Я понимаю, что открывающих - закрывающих тегов нет. Но так загружается с сайта. 
ЧтениеXML() вываливается с ошибкой и ругается на конец файла.
я так понимаю, проблема в том что он не может определить закрывающий тег верно?
можно ли как то заставить его читать от тега к тегу?
Спасибо.
 
  Рекламное место пустует
   flafla
 
1 - 22.03.18 - 08:41
Стандартный код загрузки выглядит вот так:

Чтение = Новый ЧтениеXML; 
        Чтение.ОткрытьФайл("C:\111233\webto1c.xml");
        Пока Чтение.Прочитать() Цикл
            Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента И Чтение.Имя = "NewRequest" Тогда
                     НовыйДокумент = Документы.cleanЗаказССайта.СоздатьДокумент();
                    НовыйДокумент.Дата = ТекущаяДата();
                    Адрес = Новый Структура;
                    стр = Новый Структура;
                 КонецЕсли;
            Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда 
                ИмяУзла = Чтение.Имя; 

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

                // начало элемента 

                Пока Чтение.ПрочитатьАтрибут() Цикл 
                    // Прочитать данные узла атрибута. 

                    ТипУзла = Чтение.ТипУзла;
                    Сообщить (ТипУзла);
                    Имя = Чтение.Имя;
                    Сообщить(Имя);
                    Значение = Чтение.Значение;
                    Сообщить(Значение);
                    Адрес.Вставить(Имя,Значение);
                    Сообщить (Адрес);
                    // Обработать полученные значения.

                КонецЦикла;
                ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда 
                    Если ИмяУзла = "Date" Тогда
                        НовыйДокумент.ДатаССайта = XMLЗначение(Тип("Дата"),Чтение.Значение);
                        Сообщить(Чтение.Значение);
                    ИначеЕсли ИмяУзла = "Number" Тогда
                        Новыйдокумент.НомерЗаказа =  Чтение.Значение;
                         Сообщить(Чтение.Значение);
                    ИначеЕсли ИмяУзла = "Addr" Тогда
                    НовыйДокумент.Адрес = Адрес.Town + " " + Адрес.Street + " " + Адрес.House + " " + Адрес.flat;
                    Сообщить(Адрес.Town + " " + Адрес.Street + " " + Адрес.House + " " + Адрес.flat);
                    ИначеЕсли ИмяУзла = "RequestDate" Тогда
                        Новыйдокумент.ДатаВыезда = XMLЗначение(Тип("Дата"),Чтение.Значение);
                        Сообщить(Чтение.Значение); 
                    ИначеЕсли ИмяУзла = "PhNumber" Тогда
                        НовыйДокумент.НомерТелефона = Прав(Чтение.Значение,СтрДлина(Чтение.Значение)-1);
                         Сообщить(Чтение.Значение);
                        //стр.Вставить("НомерТелефона", Прав(Чтение.Значение,СтрДлина(Чтение.Значение)-1)); 

                    ИначеЕсли ИмяУзла = "Customer" Тогда
                        НовыйДокумент.Клиент = Чтение.Значение;
                         Сообщить(Чтение.Значение);
                        //ПолучитьКлиентаПоНомеруТелефона(стр.НомерТелефона, Чтение.Значение);

                    ИначеЕсли  ИмяУзла = "Comments" Тогда
                        НовыйДокумент.Комментарий = Чтение.Значение;
                        Сообщить(Чтение.Значение);

                //Сообщить("Текст:" + Чтение.Значение); 

                КонецЕсли;

            ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента И Чтение.Имя = "NewRequest" Тогда
                НовыйДокумент.Адрес = Адрес.Town + " " + Адрес.Street + " " + Адрес.House + " " + Адрес.flat;

                НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
            
            КонецЕсли; 
        КонецЦикла;
   Cool_Profi
 
2 - 22.03.18 - 08:41
А добавить руками в конец закрывающий?
   flafla
 
3 - 22.03.18 - 08:43
Выгрузка идет с сайта, каждый день добавлять руками закрывающий будет неудобно.
Вопрос в том, как можно обойти отсутствие этого закрывающего
   flafla
 
4 - 22.03.18 - 08:46
Даже наверное вопрос будет правильно указать так: можно ли ка кто программно все таки вычислить этот конец файла и перед обработкой писать туда закрывающий тег?
   YAGolova
 
5 - 22.03.18 - 08:48
(4) читай как текст, добавляй нужную строку и сохраняй
   etc
 
6 - 22.03.18 - 08:49
Ошибка данного XML в том что корневой тег должен быть один, а тут он повторяется. Соответственно xml парсер не может по тегу определить конец документа.
Можешь попробовать обхитрить парсер. Вставь второй строкой (после заголовка) <root> а в конце файла </root>. Тогда и парсер поймет твой файл.
   flafla
 
7 - 22.03.18 - 08:51
(5) Спасибо. я попробую.
   бомболюк
 
8 - 22.03.18 - 09:02
а нельзя чтоль сайтоведа нагнуть чтоб нормальный XML отдавал а не всякую фигню?
   Сияющий в темноте
 
9 - 22.03.18 - 09:04
И чего,парсер не может прочитать данный файл?
читаем следующий тег,если он есть,то обрабатываем нащ реквест до закрытия,если читать больше нечего,вот и кончился наш файлзачем еще огород городить?
   flafla
 
10 - 22.03.18 - 09:09
(9) не может, вываливается с ошибкой 

{Документ.cleanЗаказССайта.Форма.ФормаСписка.Форма(36)}: Ошибка при вызове метода контекста (Прочитать)
        Пока Чтение.Прочитать() Цикл
по причине:
Ошибка разбора XML:  - [12,2]
Фатальная ошибка:
Extra content at the end of the document
SystemId: file://C:/111233/webto1c.xml
 
 
   xxTANATORxx
 
11 - 22.03.18 - 09:13
(8)+500
самый дельный совет
   igork1966
 
12 - 22.03.18 - 09:14
(9) Это не соответствует стандарту xml

https://ru.wikipedia.org/wiki/XML
"Логическая структура
Все составляющие части документа обобщаются в пролог и корневой элемент. Корневой элемент — обязательная часть документа, составляющая всю его суть (пролог, вообще говоря, может отсутствовать). Может включать (а может не включать) вложенные"
   igork1966
 
13 - 22.03.18 - 09:15
(0) Это не XML, а некий файл "по мотивам"
   Serg_1960
 
14 - 22.03.18 - 10:28
(10) Ошибка не в структуре файла XML, а в алгоритме работы с ним.
Можно, как вариант чтение делать в попытке, а по исключению - анализ ошибки и нормальное завершение работы. Можно, как вариант, после чтения конца элемента "NewRequest" и записи документа - очищать "НовыйДокумент = Неопределено;" - это будет своеобразным "маркером" нормального завершения работы.
   CountR
 
15 - 22.03.18 - 10:53
Вы как не программисты ) 
В (5) и (6) даны дельные советы - добавляем корневой элемент, и задача сводится к уже решенной - разбор стандартного xml файла.
   Radkt
 
16 - 22.03.18 - 11:36
(0) как в (5) или просто читай как текст


Список тем форума
Рекламное место пустует  
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует