Имя: Пароль:
1C
 
Разбор XML не стандартного типа.
,
0 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() вываливается с ошибкой и ругается на конец файла.
я так понимаю, проблема в том что он не может определить закрывающий тег верно?
можно ли как то заставить его читать от тега к тегу?
Спасибо.
1 flafla
 
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;

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

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