Имя: Пароль:
1C
 
Чем работать с большими xml
0 sda553
 
06.10.10
06:52
Обработка должна вырезать из xml определенный кусок в середине и сделать из него отдельную xml. Проблема что 1С валится с нехваткой памяти при больших xml

Вначале пробовал DocumentDOM
   //Первый вариант через DOM
   ЧтениеXML = Новый ЧтениеXML;
   ЧтениеXML.ОткрытьФайл(ИмяФайла);        
   ПостроительDOM = Новый ПостроительDOM;
   ДокументДом = ПостроительDOM.Прочитать(ЧтениеXML);
   ЧтениеXML.Закрыть();
   КорневойЭлемент = ДокументДом.ПервыйДочерний;
   Для каждого ЭлДом Из КорневойЭлемент.ДочерниеУзлы Цикл
       Если ЭлДом.ИмяУзла = "tps:Needle" Тогда  //Нужный нам кусок xml-ки
           ЗаписьДом = Новый ЗаписьDOM;
           ЗаписьXML = Новый ЗаписьXML;
           ЗаписьXML.УстановитьСтроку("UTF-8");
           ЗаписьДом.Записать(ОбъектДом,ЗаписьXML);
           СтрокаXML = ЗаписьXML.Закрыть();
       КонецЕсли;
   КонецЦикла;    

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

Вначале все было хорошо и обработка вырезала объект tps:Needle размером до 150 тыс строк в xml представлении, но потом попалась такая длинная xml что все таки 1С не смогла ее переварить и вывалилась на            СтрокаXML = ЗаписьXML.Закрыть();

У объекта tps:Needle в xml представлении около 250 тыс. строк. Чем все таки можно это дело оттуда вырезать? А то я уже прихожу к мысли о том что надо через текстовыйДокумент ее открывать и парсить самому...
1 Маленький Вопросик
 
06.10.10
06:53
большие хмд - это какие?
2 sda553
 
06.10.10
06:54
Я же написал, в xml представлении объект до 250 тыс строк
3 Маленький Вопросик
 
06.10.10
06:54
(2) весит сколько?
4 sda553
 
06.10.10
06:56
соответственно около 250 тыс элементов в объекте, к тому же это все сидит внутри xml где еще до нужного объекта несколько таких объектов ненужных такого же размера и после него.
Вес всей xml около 300 мб, вес нужного куска около 15 Мб
5 Рэйв
 
06.10.10
06:58
(4)Да найди ты свой объект напрямую блокнотом. Вырежи и вставь в новый текстовый файл.
потом этот текст читай и пиши в свежий xml
6 Маленький Вопросик
 
06.10.10
07:00
(4) хм... я работал с xml-инами весом около 900 Мб!  - и читал и записывал... - проблем не было таких, памяти на компе было правда 3 Гб - так что может просто памяти добавить и не заморачиваться???
7 sda553
 
06.10.10
07:00
Так мне это надо чтобы 1С это автоматом делала а не вручную. Кстати когда я пробовал руками проделать тот же фокус и открыл эту xml в текстовом редакторе, потом выделил все что до нужного куска и нажал del 1С тоже вылетела с окном "Недостаточно памяти"
8 Маленький Вопросик
 
06.10.10
07:02
(7) огласи параметры железа и что основное висит в памяти...
9 Рэйв
 
06.10.10
07:02
(7)Ну тогда памяти докидывай.Или машину ищи где ее достаточно
10 sda553
 
06.10.10
07:02
+(7) Имеется в виду текстовый редактор 1С. Блокнот открывает ее где то час - не дождался
11 Маленький Вопросик
 
06.10.10
07:03
(10) открывает час??? у тебя что там Пентиум 75?????
12 sda553
 
06.10.10
07:04
Памяти у меня 2Гб, основное что висит это firefox (сейчас когда мисту смотрю) 153 Мб, svchost 61 Мб, 1cv8 56 Мб

(11) Ну может не час, но я блокнота не дождался
13 Маленький Вопросик
 
06.10.10
07:06
(12) диск С почисть - может загажен... места для темпа не хватает...
14 sda553
 
06.10.10
07:09
(13) Сейчас попробую на другой, более мощной машине тоже самое запустить, потом отпишусь
15 Zixxx
 
06.10.10
07:44
(14) 1c xml читает потоком ей пофигу какой размер файла, писал и читал xml по 3Гб никаких тормазов небыло
16 sapphire
 
06.10.10
08:00
Microsoft DOM.Document
17 Moriarti
 
06.10.10
08:19
Мне 1С-овская реализация работы с XML сразу не понравилась.
Я решил работать по старинке:

function GetValue(Node, NodeName)
   for i = 0 to Node.childNodes.length-1 do
       if Node.childNodes.item(i).NodeName = NodeName then
           return Node.childNodes.item(i).Text;
       Endif;    
   EndDo;    
EndFunction    

xmlDoc = Новый COMОбъект("Microsoft.XMLDOM");
xmlDoc.Load(TempDir+"\GetList.xml");
RootNode = xmlDoc.DocumentElement;
for i = 0 to RootNode.ChildNodes.length - 1 do
       Node = RootNode.ChildNodes.item(i);
       if Node.NodeName = "Филиал" then
           s = GetValue(Node, "Филиал");
       EndIf;    
EndDo;
18 Moriarti
 
06.10.10
08:20
^^^ обрабатывал XML до 10 мегабайт!
19 nop
 
06.10.10
08:21
я бы XML вообще запретил
20 Elysee
 
06.10.10
08:22
Bred неплохо может читать xml
21 Живой Ископаемый
 
06.10.10
08:24
закладка
22 Zixxx
 
06.10.10
08:34
(17), (19) это видимо от незнания или непонимания
23 Moriarti
 
06.10.10
09:00
(19) Да конечно, а как данными обмениваться? через dbf-ки?
24 Zixxx
 
06.10.10
09:06
(23) Ctrl + Insert, Shift + Insert - бугага
25 Dem1urg
 
06.10.10
09:15
(17) +1 Используй XMLDOM и дальше SelectSingleNode или SelectNodes в зависимости от того, что тебе нужно. Правда придётся немного въехать в XPath, но совсем немного.