Как прочитать xml

1. XelOla 19 05.10.21 16:37 Сейчас в теме
Здравствуйте!
Есть файл с таким содержимым
<offer id="2хх70" available="true">
<url>http://3хххх.net/products/ramka-vklххх-3-ххххх-so-shnurovkoy</url>;
<price>6х</price>
<currencyId>RUB</currencyId>
<categoryId>11ххх</categoryId>
<picture>https://cхххm/items/166310/0/700-nw.jpg</picture>;
<store>false</store>
<pickup>false</pickup>
<barcode>29хххх1</barcode>
<delivery>false</delivery>
<name>Рамка-вкладыш "3 ботинка" со шнуровкой</name>
<shop-sku>2ххх0</shop-sku>
<manufacturer>Лесная мастерская</manufacturer>
<count>1000</count>
<description>Тут описание товара.</description>
<vendorCode>26хх70</vendorCode>
<weight>0.415</weight>
<param name="xml-generator-id">1</param>
<param name="Вид">Планшеты</param>
<param name="Возраст">От 3 лет</param>
<param name="Из натурального дерева">Да</param>
<param name="Количество элементов">12</param>
<param name="Лицензия">Нет</param>
<param name="Материал">Дерево</param>
<param name="Размер">21 см × 29 см × 1 см</param>
<param name="Размер упаковки">21 см × 29 см × 2 см</param>
<param name="Склад">Кхх 2</param>
<param name="Срок доставки">1 день</param>
<param name="Страна производителя">Китай</param>
<param name="Тематика">Детская</param>
<dimensions>21/хх/2</dimensions>
</offer>
Показать

Как его прочитать?
	Пока Чтение.Прочитать() Цикл  
		Счетчик = Счетчик + 1; 
		если Счетчик > 0 Тогда
		// анализируем тип элемента и его имя
		Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			Сообщить("Имя "+ чтение.имя);
			Если чтение.имя = "category" Тогда  
			ИД = 0; Наименование = "";  ПарентИд = 0;
				Пока Чтение.ПрочитатьАтрибут() Цикл
					//Сообщить("Значение "+ чтение.Значение); 
					Если чтение.Имя = "id" Тогда 
						Ид = чтение.Значение; 
						СТР = ТЗГрупп.Добавить();
						СТР.ИД = Ид; 
					ИначеЕсли чтение.Имя = "parentId" Тогда
                        ПарентИд = чтение.Значение;
						СТР.ПарентИд = ПарентИд; 
					КОнецЕсли;
				КонецЦикла;
			КонецЕсли;   
			Если чтение.имя = "offer" Тогда  
				ИДном = 0; Наименованиеном = "";  ПарентИдном = 0;  
				barcode = ""; shopsku = ""; description = ""; weight = ""; 
				Чтение.Прочитать();
				Если чтение.Имя = "id" Тогда
					ИДном = чтение.Значение;  
					Сообщить("ИДном " + ИДном);

				КонецЕсли;
				
			КонецЕсли;
			Если чтение.имя = "name" Тогда  
				Наименованиеном = Чтение.Значение;
				Сообщить("Наименованиеном " + Наименованиеном);
			конецЕсли;
			Если чтение.имя = "price" Тогда  
				Чтение.Прочитать();
				price = Число(Чтение.Значение);  
				Сообщить("price " + price);
			конецЕсли;
Показать


У меня только такой вариант. Может я где то заблуждаюсь, есть более простой способ?!
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. Kolesonik 15 06.10.21 11:11 Сейчас в теме
(1) можно использовать и чтение и xdto вот пример:
ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(СтрокаXML);
	Пока ЧтениеXML.Прочитать() Цикл
		Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			Если ЧтениеXML.Имя = "order" Тогда // Считываем Заказ в XDTO
				ДанныеЗаказа = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
				Если ДанныеЗаказа.status.title = "Получен складом" Тогда
					// Обробатываем данные заказа
				КонецЕсли
			Иначе
				ЧтениеXML.Прочитать();
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	ЧтениеXML.Закрыть();

Показать
nomad_irk; +1 Ответить
2. Sashares 33 05.10.21 16:53 Сейчас в теме
Можно попробовать прочитать в XDTO.

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


Дальше уже из объекта xdto.
3. KoC_one 05.10.21 20:48 Сейчас в теме
(2) так а разве не надо перед этим схему xdto нарисовать?
Что-то запамятовал..
4. Sashares 33 05.10.21 20:48 Сейчас в теме
5. XelOla 19 05.10.21 23:49 Сейчас в теме
(2)
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

ох и что делать с 7 млн записей?
6. Sashares 33 06.10.21 08:57 Сейчас в теме
(5)Можете не использовать XDTO, никто ж не заставляет.
Если файл большой, то лучше использовать ЧтениеXML, т.к. оно последовательно читает, а XDTO сразу весь файл загружает в память.
Причесать только код, чтобы нормально читалось в цикле.
9. XelOla 19 06.10.21 11:35 Сейчас в теме
(6)
будьте добры, скажите как прочитать "<param name="Тематика">Детская</param>"
в чтение.Имя вижу "param"; в чтение.значение="Детская" А как знать, что это "Тематика"?
10. nomad_irk 81 06.10.21 11:40 Сейчас в теме
(9)У меня есть вариант только для обработки реквизита ОбъектXDTO типа СписокXDTO:

Свойства = ОбъектXDTO.Свойства();
Для Каждого Свойство Из Свойства Цикл
   Для Каждого ЭлементСписка Из ОбъектXDTO[Свойство.Имя] Цикл
	СтрокаСвойство = СвойстваНоменклатуры.Добавить();
	СтрокаСвойство.СвойствоИмя = ЭлементСписка.name;
			
	СтрокаЗначение = ЗначенияСвойствНоменклатуры.Добавить();
	СтрокаЗначение.ИдентификаторСтрокиСвойства = СтрокаСвойство.НомерСтроки;
				
	КоличествоВПоследовательности = ЭлементСписка.Последовательность().Количество();
	Если КоличествоВПоследовательности > 0 Тогда
		СтрокаЗначение.ЗначениеИмя = ЭлементСписка.Последовательность().ПолучитьТекст(0);
	КонецЕсли;
   КонецЦикла;
КонецЦикла;
Показать
11. XelOla 19 06.10.21 11:46 Сейчас в теме
(10)
ОбъектXDTO

Если чтение.Имя = "param" Тогда
Чтение.Прочитать();
У меня есть вот так, как читать?
12. nomad_irk 81 06.10.21 11:48 Сейчас в теме
(11)Param будет свойством типа СписокXDTO "внутри" ОбъектXDTO, если читать с помощью:

Пока Поток.ТипУзла = ТипУзлаXML.НачалоЭлемента И Поток.Имя = "offer" Цикл 
       ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Поток);
       // Обработка ОбъектXDTO
КонецЦикла;
13. XelOla 19 06.10.21 12:00 Сейчас в теме
(12)
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Поток);

чтото не понимаю, там все сразу param name="Тематика","Возраст"
14. nomad_irk 81 06.10.21 12:01 Сейчас в теме
(13)чтобы разделить используется код из (10)
15. Sashares 33 06.10.21 12:10 Сейчас в теме
(11)Используя ЧтениеXML можно читать в цикле.
Переменная ПолныйПуть содержит путь читаемого элемента или атрибута.

Примерно так:

ПолныйПуть= "";
Пока ЧтениеXML.Прочитать() Цикл
  // Обработка узла XML            
  Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
 
   ПолныйПуть= ПолныйПуть+ "/" + ЧтениеXML.Имя;
   
   Если ЧтениеXML.КоличествоАтрибутов() > 0 Тогда
    Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
     
     ЗначениеАтрибута = ЧтениеXML.Значение;
         
    КонецЦикла
   КонецЕсли
  ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
     
   ЗначениеЭлемента = ЧтениеXML.Значение;
       
  ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
   
   позУзла = Найти(ПолныйПуть+ "/", "/"+ЧтениеXML.Имя+"/");
   Если позУзла >= 1 Тогда
    ПолныйПуть= Лев(ПолныйПуть, позУзла - 1);
   КонецЕсли;
   
  КонецЕсли;
  
 КонецЦикла;
Показать


Можно добавить условие на имя читаемого атрибута/элемента и присваивать значение в нужные переменные.
16. XelOla 19 06.10.21 13:24 Сейчас в теме
17. Sashares 33 06.10.21 13:28 Сейчас в теме
(16)Не надо в XDTO читать при вашей реализации.
18. XelOla 19 06.10.21 13:34 Сейчас в теме
(17) количество атрибутов в param =1!
<param name="Срок доставки">1 день</param>
<param name="Страна производителя">Россия</param>
<param name="Температурное ограничение">Нет</param>
<param name="Упаковка">Цветная</param>
<param name="Урожай">Август - Сентябрь</param>
<param name="Урожай">Апрель - Май</param>
<param name="Урожай">Декабрь - Январь</param>
<param name="Урожай">Июнь - Июль</param>
<param name="Урожай">Октябрь - Ноябрь</param>
<param name="Урожай">Февраль - Март</param>
<param name="ШК WB">6900039758276</param>
а атм их вот сколько!
Как тогда не понимаю.
Вот я получила
Если чтение.Имя = "param" Тогда
дальше что? name="Урожай" -я не вижу совсем, только ""Август - Сентябрь""
19. Sashares 33 06.10.21 13:44 Сейчас в теме
(18)У элемента param только 1 атрибут - name. Все верно.
Просто элементов param много.
20. XelOla 19 06.10.21 13:46 Сейчас в теме
21. Sashares 33 06.10.21 13:52 Сейчас в теме
(20)Читаете атрибут у param и его значение, читаете значение элемента.
Далее в зависимости от значения атрибута присваиваете значение элемента в нужную переменную.
То есть каждый param читаете последовательно.
22. XelOla 19 06.10.21 13:55 Сейчас в теме
(21) ТАК ПЛУЧАЕТСЯ!
Но я не вижу name!!! т..е.. Чтение.имя = param, значение "От двух лет", а мне то надо ШК WB....
23. Sashares 33 06.10.21 14:01 Сейчас в теме
(22)Приложите код, поправлю
25. XelOla 19 06.10.21 14:07 Сейчас в теме
(23)
Пока Чтение.Прочитать() Цикл
Счетчик = Счетчик + 1;
если Счетчик > 0 Тогда
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если чтение.имя = "category" Тогда
ИД = 0; Наименование = ""; ПарентИд = 0;
Пока Чтение.ПрочитатьАтрибут() Цикл
Если чтение.Имя = "id" Тогда
Ид = чтение.Значение;
СТР = ТЗГрупп.Добавить();
СТР.ИД = Ид;
ИначеЕсли чтение.Имя = "parentId" Тогда
ПарентИд = чтение.Значение;
СТР.ПарентИд = ПарентИд;
КОнецЕсли;
КонецЦикла;
КонецЕсли;
Если чтение.имя = "offer" Тогда
ИДном = 0; Наименованиеном = ""; ПарентИдном = 0;
barcode = ""; shopsku = ""; description = ""; weight = "";
СТРНом = ТЗНоменклатура.Добавить();
Пока Чтение.ПрочитатьАтрибут() Цикл
Если чтение.Имя = "id" Тогда
ИДном = чтение.Значение;
СТРНом.ИД = Идном;
КонецЕсли;
КонецЦикла;
Пока НЕ (Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента и чтение.имя = "offer") и Чтение.Прочитать() Цикл
// Чтение.Прочитать()
Если не Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Если чтение.имя = "name" Тогда // вот ЗДЕСЬ нет значений из param, только полное наименование товара здесь
Чтение.Прочитать();
Наименованиеном = Чтение.Значение;
СТРНом.Наименование = Наименованиеном;

конецЕсли;

Если чтение.имя = "weight" Тогда
Чтение.Прочитать();
//Пока Чтение.ПрочитатьАтрибут() Цикл
weight = Чтение.Значение;
СТРНом.weight = weight;
//КонецЦикла;
конецЕсли;

Если чтение.Имя = "param" Тогда
Чтение.Прочитать();
//ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(чтение);
//Пока Чтение.ПрочитатьАтрибут() Цикл
ШКWB = чтение.Значение;
СТРНом.ШКWB = ШКWB;
//КонецЦикла;
КОнецЕсли;
8. nomad_irk 81 06.10.21 11:23 Сейчас в теме
(5)
Поток = Новый ЧтениеXML;
Поток.ОткрытьФайл(ИмяФайла);
Пока Поток.Прочитать() Цикл
        Пока Поток.ТипУзла = ТипУзлаXML.НачалоЭлемента И Поток.Имя = "НужноеИмяТэгаОбъекта" Цикл 
            ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Поток);
            // Обработка ОбъектXDTO
        КонецЦикла;
КонецЦикла;
24. XelOla 19 06.10.21 14:04 Сейчас в теме
Если чтение.Имя = "param" Тогда
Чтение.Прочитать();
//ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(чтение);
//Пока Чтение.ПрочитатьАтрибут() Цикл
ШКWB = чтение.Значение;
СТРНом.ШКWB = ШКWB;
//КонецЦикла;
КОнецЕсли;
26. Sashares 33 06.10.21 14:09 Сейчас в теме
(24) Примерно так
Если чтение.Имя = "param" Тогда

ЗначениеАтрибута  = "";
Пока Чтение.ПрочитатьАтрибут() Цикл
Если Чтение.Имя = "name" Тогда
ЗначениеАтрибута = Чтение.Значение;
Прервать;
КонецЕсли;
КонецЦикла;

Чтение.Прочитать();
Если ЗначениеАтрибута = "ШК WB" Тогда //аналогично для других 
ШКWB = чтение.Значение;
СТРНом.ШКWB = ШКWB;
КонецЕсли;
КОнецЕсли; 
Показать
KoC_one; XelOla; +2 Ответить
27. XelOla 19 06.10.21 14:17 Сейчас в теме
(26)
Если чтение.Имя = "param" Тогда 
								ЗначениеАтрибута  = "";
								Пока Чтение.ПрочитатьАтрибут() Цикл
									Если Чтение.Имя = "name" Тогда
										ЗначениеАтрибута = Чтение.Значение;  
										Сообщить("" + ЗначениеАтрибута);  
										Чтение.Прочитать();
										ШКWB = чтение.Значение;
//вот так получается надо в ЗначенииАтрибута - "Штрикод Вайлдберриз", в ЧтениеЗначение - наконец тооооо сам штрихкод
										Прервать;
									КонецЕсли;
								КонецЦикла;
Показать
Оставьте свое сообщение

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