Имя: Пароль:
1C
1С v8
Парсинг XML отсутствие открытого тега
0 MAPATNK2
 
naïve
19.03.18
15:58
Добрый день. Есть XML файлик в виде:

<part id="9" sclad="1" price="11485" old_price="0">
<name>
AVR CG2600 - электронный блок управления двигателем и напряжением
</name>
<img>m009.jpg</img>
<art>00000000267</art>
<desc>
Автоматический регулятор напряжения CG2600, AC Module Unit 30-22TC
</desc>
<groups>
<group parent="18">716</group>
</groups>
</part>


Всё вроде бы ничего, но в некоторых строках данного файла имеются пустые значения и вместо
<img> </img> данного метода отображения пустых значений в файле используется
</img> просто закрытие тега.
Парсинг с помощью стека имен, т.е. открывается тег - записывается в стек, закрывается тег, удаляется из стека. А тут получается, что закрывающий тег удаляет другие теги. Как то можно это победить? Может есть какой-то универсальный метод парсинга XML файла, который будет знать что неоткрытый тег </img> - это пустое значение?
1 Вафель
 
19.03.18
15:59
Вот так должно быть
<img/>
2 MAPATNK2
 
naïve
19.03.18
16:00
(1) да, прошу прощения, так
3 Ник080808
 
19.03.18
16:01
(0) xdto
4 Вафель
 
19.03.18
16:01
И в чем проблема? Это так и должно быть.
Если файлы не большие - делай через фабрику
5 MAPATNK2
 
naïve
19.03.18
16:01
(2) Черт, тормознул. Спасибо, поробую какой-нибудь поиск придумать
6 Сияющий в темноте
 
19.03.18
19:56
Мы читаем тег из файла,если слеша в нем нет,то это открытие тага,если слеш стоит в начале,то это закрытие тага,а если слеш в конце,то этл самозакрывающийся таг,в этом случае,парсер предполагает,что он встретил сразу и открытие и закрытие
7 mistеr
 
19.03.18
21:26
(0) А что побудило писать собственный XML парсер?

Я в принципе не осуждаю, просто любопытно.
8 MAPATNK2
 
naïve
20.03.18
07:44
(7) бесплатных, универсальных парсеров на просторе интернета, к сожалению, не нашел.
9 d4rkmesa
 
20.03.18
08:19
(8) Речь вообще об 1С? Зачем изобретать велосипед? Не в вашу сторону, но неимоверно раздражает. Понапишут свои парсеры, а потом суются со своими абсурдными требованиями, видите ли выгруженный через XDTO не нравится, то пустые тэги, то пространство имен пустое должно быть, то еще какая дребедень.
10 Genayo
 
20.03.18
09:04
(9) Вот иногда из сторонних систем типа аксапты или еще чего похуже такие xml приходят, что через XDTO нормально не прочитать...
11 Serg_1960
 
20.03.18
09:09
(9) Не спеши осуждать, не обладая всей информацией.

Иногда, когда приходится искать ошибки в сообщениях обмена (например, из не 1С-базы; например, очень большого размера с изменениями конфигурации внутри), то легче написать свой парсер, чем искать бесплатные парсеры файлов XML. Искать, находить и убеждаться что они тебе не подходят.
12 MAPATNK2
 
naïve
20.03.18
09:45
(9) Пришли данные с сайта, которые были занесены туда руками в течение нескольких лет. XDTO пользоваться не умею. Пришел запрос, загрузить всю эту неструктурированную хрень в 1с базу. Вот и сижу мучаюсь. ТО тут, то там ошибка. Уже 2 день.
13 Рэдрик Шухарт
 
20.03.18
09:52
(12)А ЧтениеXML  не устраивает по религиозным причинам или как?
14 Cyberhawk
 
20.03.18
10:07
Можно преобразовать ХМЛ-строку к каноничечкому виду
15 Cyberhawk
 
20.03.18
10:08
(12) А ты там кем?
16 MAPATNK2
 
naïve
20.03.18
12:11
(13) "Чтение XML " как раз этим и пользуюсь.
17 MAPATNK2
 
naïve
20.03.18
12:14
(13)
Парсер = Новый ЧтениеXML;
    Парсер.ОткрытьФайл(ВыбратьФайл);
    
    СтекИмен = Новый СписокЗначений;
    
    ТЗгр.Очистить();
    ТЗпарт.Очистить();
    
    Пока Парсер.Прочитать() Цикл
        Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            СтекИмен.Добавить(Парсер.Имя);
            ПолныйПуть = ПостроитьПуть(СтекИмен);
            
            Если ПолныйПуть = "/section/groups/group" Тогда
                
                //Парсер.Прочитать();
                
                //Если Парсер.ТипУзла = ТипУзлаXML.Текст Тогда
                
                Группа=ЭтаФОрма.ТЗгр.Добавить();
                Группа.id=Парсер.ЗначениеАтрибута("id");
                Группа.show=Парсер.ЗначениеАтрибута("show");
                Группа.parent=Парсер.ЗначениеАтрибута("parent");
                Парсер.Прочитать();
                Группа.Наименование=Парсер.Значение;

Это участок кода.
Проблема в том, что условие
Если ПолныйПуть = "/section/groups/group" Тогда

не отрабатывает. При отладке, получая значения "ПолныйПуть " выводится левая инфа. Не /section/groups/group а /section/group либо /section/groups/ и в зависимости какое условие ты ставишь, именно такой путь не будет прописываться в реквизите "ПолныйПуть ". Чудеса, да и только. XML уходит от условия XD
18 Serg_1960
 
20.03.18
13:43
(17) Озвучивая неполную информацию, Вы рискуете получить недостоверный ответ :( Из алгоритма не совсем (а точнее -
совсем) непонятно как Вы формируете полный путь и не исключено, что ошибка кроется именно там.

Вот ссылка, где указано всё весьма подробно:
http://catalog.mista.ru/public/311011/
19 MAPATNK2
 
naïve
20.03.18
14:15
(18) Спасибо.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.