Имя: Пароль:
1C
1С v8
Правильный обход xml файла
,
0 Solitar
 
12.04.13
10:31
Подскажите, как правильно обходить вот такой кусок xml.

<Контрагент>Егор</Контрагент>
<Сумма_Статья>
       <S ct:index="1">
         <NUM>1</NUM>
         <Item>36400</Item>
       </S>
       <S ct:index="2">
         <NUM>2</NUM>
         <Item>28380</Item>
       </S>
</Сумма_Статья>

<НазваниеСтатьи>
<S ct:index="1">
         <NUM>1</NUM>
         <Item>Расходные материалы ИТ</Item>
       </S>
       <S ct:index="2">
         <NUM>2</NUM>
         <Item>Закупка оргтехники (ИНВЕСТИЦИИ)</Item>
   </S>
</НазваниеСтатьи>

То, что между тегами СуммаСтатьи и НазваниеСтатьи должно в итоге получится в таком виде

Сумма     Название статьи
36 400    Расходные материалы
28 000    Закупка
1 Maxus43
 
12.04.13
10:32
а как пытаешся и что не получается?
2 Solitar
 
12.04.13
10:41
Для теста сделал вот так (СчетчикСтатей - обычный счетчик)

ИначеЕсли Файл.Имя = "Сумма_Статья" Тогда
               Пока Файл.Прочитать() Цикл
                   Если Файл.Имя = "Сумма_Статья"  и  Файл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
                       Продолжить
                   КонецЕсли;
                   Если Файл.ПолучитьАтрибут(СчетчикСтатей - 1) = ""+ СчетчикСтатей Тогда
                       Файл.Прочитать();
                       Файл.Прочитать();
                       Файл.Прочитать();
                       Файл.Прочитать();
                       Файл.Прочитать();
                           
                               СтатьяОборотов.Сумма = Файл.Значение;
                           
                   КонецЕсли;
              КонецЦикла;

Но это ооочень не грамотно и я это понимаю. Как мне получить дочерний элемент по его значению атрибута или же это можно сделать другим способом?
3 rutony
 
12.04.13
10:45
Да так обычно и делается, только вместо н-строчек прочитать, делается условие на признаки узла. А все найденные, неоходимые данные, фигачатся в структуру.
Когда видишь заключающий узел, выплевываешь структуру, и шурстишь дальше.
4 Maxus43
 
12.04.13
10:47
Чтение = Новый ЧтениеXML;

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

Пока Чтение.Прочитать() Цикл // Прочитать «структурные части» элементов.

   // Проверить, какая часть элемента – текущая.
   Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
       ИмяУзла = Чтение.Имя;
       
       Сообщить("--" + ИмяУзла);

       // Атрибуты элементов можно читать только если текущая часть – начало элемента
       Пока Чтение.ПрочитатьАтрибут() Цикл

           // Прочитать данные узла атрибута.
           ТипУзла  = Чтение.ТипУзла;
           Имя     = Чтение.Имя;
           Значение = Чтение.Значение;
   
       // Обработать полученные значения.
       //    ...
       
       КонецЦикла;
       
   ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда    

       // В примере просто выводим текст в окно сообщений.    
       Сообщить("Текст:" + Чтение.Значение);
       
   ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда

       // В примере просто выводим признак конца элемента
       // в окно сообщений
       Сообщить("--Конец:" + Чтение.Имя);
       
   КонецЕсли;    
   
КонецЦикла
5 sapphire
 
12.04.13
10:50
(0) Использовать модель DOM & XPath
6 Fragster
 
гуру
12.04.13
10:57
я за XSD + XDTO
7 sapphire
 
12.04.13
11:02
(6) Ты догадываешься, наверное, сколько времени он угробит для написания хотя бы пакета XDTO:)
8 Jolly Roger
 
12.04.13
11:06
(0) xslt
9 Fragster
 
гуру
12.04.13
11:24
(7) сколько? вбиваешь в яндексе "генерация XSD по имеющемуся XML", меняешь типы чуть-чуть
10 Fragster
 
гуру
12.04.13
11:24
(9)+ чтобы превратить числа в числа и даты в даты из строк. повторяемость правильную описываешь. и все
11 Solitar
 
12.04.13
11:25
(5) скорее всего так и буду делать.

возник вопрос, почему данное выражение не работает.

Файл = Новый ЧтениеXML;
Файл.ОткрытьФайл(ИмяФайла);

ДОМ = Новый ПостроительDOM;
Модель = ДОМ.Прочитать(Файл);
СтрокаXPath = "/documents";
ВыражениеXPath = Модель.СоздатьВыражениеXPath(СтрокаXPath, Новый РазыменовательПространствИменDOM(Модель));
Результат = ВыражениеXPath.Вычислить(Модель);

В результате пусто.
Верхний тег
<documents>
12 acsent
 
12.04.13
11:25
ФабрикаXDTO.Прочитать(ЧтениеXML)
13 Fragster
 
гуру
12.04.13
11:26
(12) только там проверку список-не список-пустой список и преобразование строк в нормальные типы надо добавлять
14 Fragster
 
гуру
12.04.13
11:26
если без схемы
15 acsent
 
12.04.13
11:27
(13) это элементарно, гораздо лучше чем xsd рисовать
16 Fragster
 
гуру
12.04.13
11:29
(15) иногда можно просто попросить схему у того, кто предоставляет XML... если там не заляпушно файл делают, то предоставят...
17 Solitar
 
12.04.13
11:56
(16) как эта схема должна выглядеть?
18 Адимр
 
12.04.13
11:59
(6) Итераторы глючат у xdto.
19 Fragster
 
гуру
12.04.13
12:19
(18) не глючат
20 Fragster
 
гуру
12.04.13
12:20
(17) возьми любой пакет XDTO из конфигурации, сделай его экспорт и посмотри
21 Solitar
 
12.04.13
12:38
(20) а что мне даст эта схема?
22 Solitar
 
12.04.13
13:37
какой самый простой способ все таки??

Начал делать через XDTO, но как обратится к следующему документу не через цикл? Можно ли накладывать отборы на XDTO?
23 Fragster
 
гуру
12.04.13
13:44
а чем цикл не нравится?