|   |   | 
| 
 | Правильный обход 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 | 
        а чем цикл не нравится?     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |