Имя: Пароль:
1C
1С v8
Чтение атрибутов XML файла, у которых нет имени
,
0 ac13
 
27.04.17
13:54
Как прочитать атрибуты XML файлов, если у атрибутов нет имени, например так:

<offer id="20" available="true">
<url>Адрес_ссылки</url>
<price>900</price>
<picture>Ссылка_на_картинку</picture>
<name>Название_товара</name>
<param name="Цвет">Зеленый</param>
<param name="Вес" unit="Кг">3</param>
</offer>

То есть например атрибуты с названием, ценой и ссылкой на картинку без имени.
1 ac13
 
27.04.17
13:56
Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
Если Атрибут = "Цвет" Тогда
Объект.Цвет = ЧтениеXML.Значение;
КонецЕсли;

А как быть с ценой и названием?
2 бомболюк
 
27.04.17
14:19
это зовется "элементы", а не "атрибуты без названия"
3 ac13
 
27.04.17
14:23
(2) спасибо :D
4 ac13
 
27.04.17
14:24
как прочитать элементы?
5 бомболюк
 
27.04.17
14:29
как нить так
Если (ЧтениеXML.Имя = "price") И (ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента) тогда
        Если ЧтениеXML.Прочитать() тогда
            Сообщить(ЧтениеXML.Значение);
        КонецЕсли;
КонецЕсли;
6 ac13
 
27.04.17
14:29
Чтение.ПолучитьАтрибут("price")

так?
7 бомболюк
 
27.04.17
14:29
а ваще нада юзать XPath
8 ac13
 
27.04.17
14:29
(5) спасибо. сейчас как-нибудь попробую
9 Вафель
 
27.04.17
14:30
(7) может лучше XDTO стразу?
10 бомболюк
 
27.04.17
14:32
(9) я не против ;-)
11 ac13
 
27.04.17
14:34
(5) спасибо

ЧтениеXML.Имя = "price"

Да!)
12 ac13
 
05.05.17
11:29
<offer id="20" available="true">
<url>Адрес_ссылки</url>
<price>900</price>
<picture>Ссылка_на_картинку</picture>
<name>Название_товара</name>
<param name="Цвет">Зеленый</param>
<param name="Вес" unit="Кг">3</param>
</offer>


ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);

А = 0;

Пока ЧтениеXML.Прочитать() Цикл
          Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                    ИмяУзла = ЧтениеXML.Имя;
                    Если СокрЛП(ИмяУзла) = "offer" Тогда
                              А = 1;
                              НС = ТЧ.Добавить();
                    КонецЕсли;
          ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
                    Если ИмяУзла = "price" И А = 1 Тогда
                              НС.Цена = ЧтениеXML.Значение;
                    КонецЕсли;
                    Если ИмяУзла = "name" И А = 1  Тогда
                              НС.Название = ЧтениеXML.Значение;
                    КонецЕсли;
          ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
                    А = 0;
          КонецЕсли;
КонецЦикла;
13 ac13
 
05.05.17
11:30
А мне еще надо получить значение offer id="20"
то есть значение "20"
как мне его получить?
14 ac13
 
05.05.17
11:53
Вот таким образом читает не offer id="20", а читает available="true"


Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
     ИмяУзла = ЧтениеXML.Имя;
     Если СокрЛП(ИмяУзла) = "offer" Тогда
          А = 1;
          НС = ТЧ.Добавить();
          Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
               НС.ID = ЧтениеXML.Значение;
          КонецКикла;
     КонецЕсли;
15 ac13
 
05.05.17
11:54
и в таком случае оно читает только атрибуты и не переходит к чтению текста. Т.е. остальные колонки пустые, то ID заполняет
16 ac13
 
05.05.17
12:47
получилось так:
ИмяУзла = ЧтениеXML.Имя;
            Если ИмяУзла = "offers" Тогда
                Ид = 1;
            КонецЕсли;
            
            Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
                Если Ид = 1 И ЧтениеXML.Имя = "id" Тогда
                    А = 1;
                    НС = ТЧ.Добавить();
                    НС.ID = ЧтениеXML.Значение;
                КонецЕсли;
            КонецЦикла;
17 Fragster
 
гуру
05.05.17
12:49
правильно будет потребовать (или сгенерировать/написать руками) схему для этого файла, и разбирать с помощью механизма XDTO.
18 Fragster
 
гуру
05.05.17
12:50
а эти стейт машины для чтения, они, конечно, несложные поначалу, но очень быстро превращаются в говнокод.
19 ac13
 
05.05.17
13:32
(17) для файла ничего не могу получить. есть ссылка на него и всё
20 Fragster
 
гуру
05.05.17
14:42
(19) ну тогда сделай схему сам, либо с помощью создания пакета XDTO в конфе, либо с помощью внешних инструментов (например XMLpad), там надо будет сделать указание типа для значений, где это возможно + максимальное и минимальное количество элементов в файле (для того, чтобы правильно парсер правильно разделил списоки XDTO и объекты/значения XDTO)