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