Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 мар 2024, 12:44

Чтение XML в дерево значений. Проблема с прочтением.

Автор delo_iris, 13 авг 2011, 19:08

0 Пользователей и 1 гость просматривают эту тему.

delo_iris

Читаю XML в дерево значений. Все хорошо прочиталось. Две колонки Имя и Значение.
Но выходит лесенкой: на одной строке Имя и пустое Значение, на другой Значение и пустое Имя.
А нужно Имя - Значение, Имя - Значение...
Дерево значений, которое выходит во вложении



Процедура ПрочитатьЭлемент(XMLФайл, ТекущийНаборСтрок)

Пока XMLФайл.Прочитать() Цикл
Если XMLФайл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда

НоваяСтрока = ТекущийНаборСтрок.Добавить();
НоваяСтрока.Имя = XMLФайл.Имя;
НоваяСтрока.Значение = "";
ПрочитатьЭлемент(XMLФайл, НоваяСтрока.Строки);

ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Возврат;
ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.Текст Тогда
НоваяСтрока = ТекущийНаборСтрок.Добавить();
НоваяСтрока.Имя = "";
НоваяСтрока.Значение = СокрЛП(XMLФайл.Значение);

Иначе
Сообщить("Тип узла: " + XMLФайл.ТипУзла + "   НЕ ОБРАБОТАН", СтатусСообщения.Важное);
Конецесли;
КонецЦикла;

КонецПроцедуры

delo_iris

Ой, код вот

Процедура ПрочитатьЭлемент(XMLФайл, ТекущийНаборСтрок)
   
   Пока XMLФайл.Прочитать() Цикл
      Если XMLФайл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
         
         НоваяСтрока = ТекущийНаборСтрок.Добавить();
         НоваяСтрока.Имя = XMLФайл.Имя;
         НоваяСтрока.Значение = "";
         ПрочитатьЭлемент(XMLФайл, НоваяСтрока.Строки);
         
      ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
         Возврат;
      ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.Текст Тогда
         НоваяСтрока = ТекущийНаборСтрок.Добавить();
         НоваяСтрока.Имя = "";
         НоваяСтрока.Значение = СокрЛП(XMLФайл.Значение);
         
      Иначе
         Сообщить("Тип узла: " + XMLФайл.ТипУзла + "   НЕ ОБРАБОТАН", СтатусСообщения.Важное);
      Конецесли;
   КонецЦикла;
   
КонецПроцедуры

Dethmontt

И чего ты удивляешься? Ты же сам так написал))
НоваяСтрока = ТекущийНаборСтрок.Добавить();
         НоваяСтрока.Имя = XMLФайл.Имя;
         НоваяСтрока.Значение = "";[\code]
И
[code]НоваяСтрока = ТекущийНаборСтрок.Добавить();
         НоваяСтрока.Имя = "";
         НоваяСтрока.Значение = СокрЛП(XMLФайл.Значение);[\code]
Вот и получается у тебя что каждое значение в новой строке)))
[/code]
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Dethmontt

Думать лень...
Процедура ПрочитатьЭлемент(XMLФайл, ТекущийНаборСтрок)
   
НужноДобавитьСтроку = Истина;
   Пока XMLФайл.Прочитать() Цикл
      Если НужноДобавитьСтроку Тогда
            НоваяСтрока = ТекущийНаборСтрок.Добавить();
      КонецЕсли;
      Если XMLФайл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
         
         
         НоваяСтрока.Имя = XMLФайл.Имя;
         НоваяСтрока.Значение = "";
         ПрочитатьЭлемент(XMLФайл, НоваяСтрока.Строки);
         НужноДобавитьСтроку = Ложь;
         
      ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
         Возврат;
      ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.Текст Тогда
         
         НоваяСтрока.Имя = "";
         НоваяСтрока.Значение = СокрЛП(XMLФайл.Значение);
         НужноДобавитьСтроку = Истина;
      Иначе
         Сообщить("Тип узла: " + XMLФайл.ТипУзла + "   НЕ ОБРАБОТАН", СтатусСообщения.Важное);
      Конецесли;
   КонецЦикла;
   
КонецПроцедуры

Супер простое решение)))
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

delo_iris

Цитата: Dethmontt от 13 авг 2011, 22:38
И чего ты удивляешься? Ты же сам так написал))
НоваяСтрока = ТекущийНаборСтрок.Добавить();
         НоваяСтрока.Имя = XMLФайл.Имя;
         НоваяСтрока.Значение = "";[\code]
И
[code]НоваяСтрока = ТекущийНаборСтрок.Добавить();
         НоваяСтрока.Имя = "";
         НоваяСтрока.Значение = СокрЛП(XMLФайл.Значение);[\code]
Вот и получается у тебя что каждое значение в новой строке)))
[/code]

Да, понимаю, что получается каждое значение в отдельной строке. Но как сделать по другому не понимаю....(

delo_iris

Цитата: Dethmontt от 13 авг 2011, 22:50
Думать лень...
Процедура ПрочитатьЭлемент(XMLФайл, ТекущийНаборСтрок)
   
НужноДобавитьСтроку = Истина;
   Пока XMLФайл.Прочитать() Цикл
      Если НужноДобавитьСтроку Тогда
            НоваяСтрока = ТекущийНаборСтрок.Добавить();
      КонецЕсли;
      Если XMLФайл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
         
         
         НоваяСтрока.Имя = XMLФайл.Имя;
         НоваяСтрока.Значение = "";
         ПрочитатьЭлемент(XMLФайл, НоваяСтрока.Строки);
         НужноДобавитьСтроку = Ложь;
         
      ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
         Возврат;
      ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.Текст Тогда
         
         НоваяСтрока.Имя = "";
         НоваяСтрока.Значение = СокрЛП(XMLФайл.Значение);
         НужноДобавитьСтроку = Истина;
      Иначе
         Сообщить("Тип узла: " + XMLФайл.ТипУзла + "   НЕ ОБРАБОТАН", СтатусСообщения.Важное);
      Конецесли;
   КонецЦикла;
   
КонецПроцедуры

Супер простое решение)))


Не работает((
Как уже только не пыталась.

Dethmontt

Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Dethmontt

Сорри, я рекурсию не заметил.
Вот так тогда надо!

Перем НоваяСтрока;
Процедура ПрочитатьЭлемент(XMLФайл, ТекущийНаборСтрок,НужноДобавитьСтроку = Истина)
   

   Пока XMLФайл.Прочитать() Цикл
      Если НужноДобавитьСтроку Тогда
            НоваяСтрока = ТекущийНаборСтрок.Добавить();
      КонецЕсли;
      Если XMLФайл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
         
         
         НоваяСтрока.Имя = XMLФайл.Имя;
         НоваяСтрока.Значение = "";
         ПрочитатьЭлемент(XMLФайл, НоваяСтрока.Строки,Ложь);
         НужноДобавитьСтроку = Ложь;
         
      ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
         Возврат;
      ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.Текст Тогда
         
         НоваяСтрока.Имя = "";
         НоваяСтрока.Значение = СокрЛП(XMLФайл.Значение);
         НужноДобавитьСтроку = Истина;
      Иначе
         Сообщить("Тип узла: " + XMLФайл.ТипУзла + "   НЕ ОБРАБОТАН", СтатусСообщения.Важное);
      Конецесли;
   КонецЦикла;
   
КонецПроцедуры

Возможно будет ругаться на новаяСтрока если ее не сделать общей переменной
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

delo_iris

Цитата: Dethmontt от 14 авг 2011, 02:20
Дай XML ?

<Document-Order>
<Order-Header>
<OrderNumber>
4504441730
</OrderNumber>
<OrderDate>
2011-05-20
</OrderDate>
<ExpectedDeliveryDate>
2011-05-27
</ExpectedDeliveryDate>
<ExpectedDeliveryTime>
04:30
</ExpectedDeliveryTime>
<ContractNumber>
NF-1193
</ContractNumber>
<ContractDate>
2009-01-01
</ContractDate>
<DocumentFunctionCode>
O
</DocumentFunctionCode>
</Order-Header>
<Order-Parties>
<Buyer>
<ILN>
4606068999995
</ILN>
</Buyer>
<MessageRecipient>
<ILN>
4607187799992
</ILN>
</MessageRecipient>
<Seller>
<ILN>
4607187799992
</ILN>
<CodeByBuyer>
0000100147
</CodeByBuyer>
<Name>
ЗАО "Аксе"
</Name>
</Seller>
<DeliveryPoint>
<ILN>
4606068999971
</ILN>
</DeliveryPoint>
<Invoicee>
<ILN>
4606068999995
</ILN>
</Invoicee>
</Order-Parties>
<Order-Lines>
<Line>
<Line-Item>
<LineNumber>
10
</LineNumber>
<EAN>
026102098271
</EAN>
<BuyerItemCode>
631003053642
</BuyerItemCode>
<ItemDescription>
Масленка Fume LUMINARC Арт. 48600 (Франция)
</ItemDescription>
<ItemType>
CU
</ItemType>
<OrderedQuantity>
1.00
</OrderedQuantity>
<OrderedUnitPacksize>
16.00
</OrderedUnitPacksize>
<UnitOfMeasure>
CT
</UnitOfMeasure>
<OrderedUnitNetPrice>
117.64
</OrderedUnitNetPrice>
<NetAmount>
1882.24
</NetAmount>
<GrossAmount>
2221.04
</GrossAmount>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>
20
</LineNumber>
<EAN>
2099999881989
</EAN>
<BuyerItemCode>
630705067146
</BuyerItemCode>
<ItemDescription>
Форма разборная COCKTAIL 26 см Арт. 407026 (Франция)
</ItemDescription>
<ItemType>
CU
</ItemType>
<OrderedQuantity>
1.00
</OrderedQuantity>
<OrderedUnitPacksize>
6.00
</OrderedUnitPacksize>
<UnitOfMeasure>
CT
</UnitOfMeasure>
<OrderedUnitNetPrice>
272.69
</OrderedUnitNetPrice>
<NetAmount>
1636.14
</NetAmount>
<GrossAmount>
1930.65
</GrossAmount>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>
30
</LineNumber>
<EAN>
2099999400395
</EAN>
<BuyerItemCode>
630706099603
</BuyerItemCode>
<ItemDescription>
Кастрюля LUMINARC 0L75 ARCUISINE Арт. 02886 (Франция)
</ItemDescription>
<ItemType>
CU
</ItemType>
<OrderedQuantity>
1.00
</OrderedQuantity>
<OrderedUnitPacksize>
3.00
</OrderedUnitPacksize>
<UnitOfMeasure>
CT
</UnitOfMeasure>
<OrderedUnitNetPrice>
145.00
</OrderedUnitNetPrice>
<NetAmount>
435.00
</NetAmount>
<GrossAmount>
513.30
</GrossAmount>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>
40
</LineNumber>
<EAN>
10026102962050
</EAN>
<BuyerItemCode>
630904132062
</BuyerItemCode>
<ItemDescription>
Тарелка LUMINARC глуб 19,5 см Nemo Арт. 96205 (Франция)
</ItemDescription>
<ItemType>
CU
</ItemType>
<OrderedQuantity>
1.00
</OrderedQuantity>
<OrderedUnitPacksize>
24.00
</OrderedUnitPacksize>
<UnitOfMeasure>
CT
</UnitOfMeasure>
<OrderedUnitNetPrice>
139.58
</OrderedUnitNetPrice>
<NetAmount>
3349.92
</NetAmount>
<GrossAmount>
3952.91
</GrossAmount>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>
50
</LineNumber>
<EAN>
10026102363666
</EAN>
<BuyerItemCode>
630909137515
</BuyerItemCode>
<ItemDescription>
Кувшин LUMINARC 1L 3 ARC Арт. 36366 (Франция)
</ItemDescription>
<ItemType>
CU
</ItemType>
<OrderedQuantity>
1.00
</OrderedQuantity>
<OrderedUnitPacksize>
6.00
</OrderedUnitPacksize>
<UnitOfMeasure>
CT
</UnitOfMeasure>
<OrderedUnitNetPrice>
93.12
</OrderedUnitNetPrice>
<NetAmount>
558.72
</NetAmount>
<GrossAmount>
659.29
</GrossAmount>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>
60
</LineNumber>
<EAN>
10026102498160
</EAN>
<BuyerItemCode>
630905143298
</BuyerItemCode>
<ItemDescription>
Салатник LUMINARC Plenitude 16см Арт. 49810 (Франция)
</ItemDescription>
<ItemType>
CU
</ItemType>
<OrderedQuantity>
1.00
</OrderedQuantity>
<OrderedUnitPacksize>
24.00
</OrderedUnitPacksize>
<UnitOfMeasure>
CT
</UnitOfMeasure>
<OrderedUnitNetPrice>
84.85
</OrderedUnitNetPrice>
<NetAmount>
2036.40
</NetAmount>
<GrossAmount>
2402.95
</GrossAmount>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>
70
</LineNumber>
<EAN>
10883314080039
</EAN>
<BuyerItemCode>
630905148840
</BuyerItemCode>
<ItemDescription>
Салатник LUMINARC Sweet Impression 12см Арт. 08003 (Франция)
</ItemDescription>
<ItemType>
CU
</ItemType>
<OrderedQuantity>
1.00
</OrderedQuantity>
<OrderedUnitPacksize>
12.00
</OrderedUnitPacksize>
<UnitOfMeasure>
CT
</UnitOfMeasure>
<OrderedUnitNetPrice>
88.86
</OrderedUnitNetPrice>
<NetAmount>
1066.32
</NetAmount>
<GrossAmount>
1258.26
</GrossAmount>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>
80
</LineNumber>
<EAN>
5902740003226
</EAN>
<BuyerItemCode>
630902151357
</BuyerItemCode>
<ItemDescription>
Кружка HUTA SZKLA WOLCZNSCY Poland Russian Tea Fume 280мл (Польша)
</ItemDescription>
<ItemType>
CU
</ItemType>
<OrderedQuantity>
1.00
</OrderedQuantity>
<OrderedUnitPacksize>
30.00
</OrderedUnitPacksize>
<UnitOfMeasure>
CT
</UnitOfMeasure>
<OrderedUnitNetPrice>
42.92
</OrderedUnitNetPrice>
<NetAmount>
1287.60
</NetAmount>
<GrossAmount>
1519.37
</GrossAmount>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>
90
</LineNumber>
<EAN>
2099999990421
</EAN>
<BuyerItemCode>
630903192375
</BuyerItemCode>
<ItemDescription>
Столовый набор LUMINARC S19 Estilo, стекло (Франция)
</ItemDescription>
<ItemType>
CU
</ItemType>
<OrderedQuantity>
2.00
</OrderedQuantity>
<OrderedUnitPacksize>
1.00
</OrderedUnitPacksize>
<UnitOfMeasure>
CT
</UnitOfMeasure>
<OrderedUnitNetPrice>
1477.54
</OrderedUnitNetPrice>
<NetAmount>
2955.08
</NetAmount>
<GrossAmount>
3486.99
</GrossAmount>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>
100
</LineNumber>
<EAN>
10883314079699
</EAN>
<BuyerItemCode>
630905204230
</BuyerItemCode>
<ItemDescription>
Салатник LUMINARC 12 см Watter Color Арт. 07969 (Франция)
</ItemDescription>
<ItemType>
CU
</ItemType>
<OrderedQuantity>
1.00
</OrderedQuantity>
<OrderedUnitPacksize>
12.00
</OrderedUnitPacksize>
<UnitOfMeasure>
CT
</UnitOfMeasure>
<OrderedUnitNetPrice>
60.51
</OrderedUnitNetPrice>
<NetAmount>
726.12
</NetAmount>
<GrossAmount>
856.82
</GrossAmount>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>
110
</LineNumber>
<EAN>
10883314079637
</EAN>
<BuyerItemCode>
630904204231
</BuyerItemCode>
<ItemDescription>
Тарелка LUMINARC глубокая Watter Color Арт. 07963 (Франция)
</ItemDescription>
<ItemType>
CU
</ItemType>
<OrderedQuantity>
1.00
</OrderedQuantity>
<OrderedUnitPacksize>
12.00
</OrderedUnitPacksize>
<UnitOfMeasure>
CT
</UnitOfMeasure>
<OrderedUnitNetPrice>
64.74
</OrderedUnitNetPrice>
<NetAmount>
776.88
</NetAmount>
<GrossAmount>
916.72
</GrossAmount>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>
120
</LineNumber>
<EAN>
10883314079606
</EAN>
<BuyerItemCode>
630904204233
</BuyerItemCode>
<ItemDescription>
Тарелка LUMINARC плоская Watter Color Арт. 07960 (Франция)
</ItemDescription>
<ItemType>
CU
</ItemType>
<OrderedQuantity>
1.00
</OrderedQuantity>
<OrderedUnitPacksize>
12.00
</OrderedUnitPacksize>
<UnitOfMeasure>
CT
</UnitOfMeasure>
<OrderedUnitNetPrice>
64.74
</OrderedUnitNetPrice>
<NetAmount>
776.88
</NetAmount>
<GrossAmount>
916.72
</GrossAmount>
</Line-Item>
</Line>
</Order-Lines>
<Order-Summary>
<TotalLines>
12
</TotalLines>
<TotalOrderedAmount>
13.00
</TotalOrderedAmount>
<TotalNetAmount>
17487.30
</TotalNetAmount>
</Order-Summary>
</Document-Order>

delo_iris

Цитата: Dethmontt от 14 авг 2011, 02:45
Сорри, я рекурсию не заметил.
Вот так тогда надо!

Перем НоваяСтрока;
Процедура ПрочитатьЭлемент(XMLФайл, ТекущийНаборСтрок,НужноДобавитьСтроку = Истина)
   

   Пока XMLФайл.Прочитать() Цикл
      Если НужноДобавитьСтроку Тогда
            НоваяСтрока = ТекущийНаборСтрок.Добавить();
      КонецЕсли;
      Если XMLФайл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
         
         
         НоваяСтрока.Имя = XMLФайл.Имя;
         НоваяСтрока.Значение = "";
         ПрочитатьЭлемент(XMLФайл, НоваяСтрока.Строки,Ложь);
         НужноДобавитьСтроку = Ложь;
         
      ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
         Возврат;
      ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.Текст Тогда
         
         НоваяСтрока.Имя = "";
         НоваяСтрока.Значение = СокрЛП(XMLФайл.Значение);
         НужноДобавитьСтроку = Истина;
      Иначе
         Сообщить("Тип узла: " + XMLФайл.ТипУзла + "   НЕ ОБРАБОТАН", СтатусСообщения.Важное);
      Конецесли;
   КонецЦикла;
   
КонецПроцедуры

Возможно будет ругаться на новаяСтрока если ее не
Цитата: Dethmontt от 14 авг 2011, 02:45
Сорри, я рекурсию не заметил.
Вот так тогда надо!

Перем НоваяСтрока;
Процедура ПрочитатьЭлемент(XMLФайл, ТекущийНаборСтрок,НужноДобавитьСтроку = Истина)
   

   Пока XMLФайл.Прочитать() Цикл
      Если НужноДобавитьСтроку Тогда
            НоваяСтрока = ТекущийНаборСтрок.Добавить();
      КонецЕсли;
      Если XMLФайл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
         
         
         НоваяСтрока.Имя = XMLФайл.Имя;
         НоваяСтрока.Значение = "";
         ПрочитатьЭлемент(XMLФайл, НоваяСтрока.Строки,Ложь);
         НужноДобавитьСтроку = Ложь;
         
      ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
         Возврат;
      ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.Текст Тогда
         
         НоваяСтрока.Имя = "";
         НоваяСтрока.Значение = СокрЛП(XMLФайл.Значение);
         НужноДобавитьСтроку = Истина;
      Иначе
         Сообщить("Тип узла: " + XMLФайл.ТипУзла + "   НЕ ОБРАБОТАН", СтатусСообщения.Важное);
      Конецесли;
   КонецЦикла;
   
КонецПроцедуры

Возможно будет ругаться на новаяСтрока если ее не сделать общей переменной
сделать общей переменной

Теперь есть только значения, а имен нет. И дерево пошло вглубь. Не знаю, как добавить изображение с получившимся деревом.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск