Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема ХМЛ (число прочтений - 5762 )
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
ХМЛ
14. Июня 2011 :: 10:45
Печать  
Поскольку DOM-объект жрет дофига памяти, крупные ХМЛ-ки приходится разбирать через ПоследовательноСчитваемыйДокумент. Это, как бы, общеизвестно.

Рисуя очередную ковырялку ХМЛ-ки, озарился идеей написать класс, который бы разбирал бы ХМЛ, скажем, в древовидную структуру на основе вложенных таблиц значений
(например, такой структуры:
Код
Выбрать все
Функция СоздатьВетвь()
	тзВозврат = СоздатьОбъект("ТаблицаЗначений");
	тзВозврат.НоваяКолонка("Имя");
	тзВозврат.НоваяКолонка("Значение");
	тзВозврат.НоваяКолонка("сзАтрибуты");
	тзВозврат.НоваяКолонка("тзПотомки");

	Возврат тзВозврат;
КонецФункции	// СоздатьВетвь 

)

Сходу сделать цивильный рекурсивный обход не получилось, по причине того, что узлы вида
<value>4</value> и <node><subnode>...</subnode></node> приходится обрабатывать абсолютно по разному.

Узел с подузлами:
Код
Выбрать все
ТипТэга = ХМЛ.Спуститься();	//спустились на уровень

Пока ТипТэга = 1 Цикл
	...
	ТипТэга = ОбработатьУзел(...);

	Если ТипТэга <> 4 Тогда
		ТипТэга = ХМЛ.Следующий();
	КонецЕсли;
КонецЦикла;

Возврат ТипТэга;
 



А для получения конкретного значения узла:
Код
Выбрать все
ХМЛ.ТекущийЭлементВВидеОбъекта().Значение 

.

Проблема в том, что ТекущийЭлементВВидеОбъекта() сбрасывает позиционирование в ХМЛ-файле (точнее, пропускает в обходе текущую ветвь со всему подузлами); а определить в процессе обхода, что текущий узел содержит значение мы можем только увидев, что
ХМЛ.Спуститься() = 1, и сразу же ХМЛ.Следующий() = 3. Но в этот момент позиционирование уже прошло узел и ХМЛ.ТекущийЭлементВВидеОбъекта() уже относится сааавсем к другой ветке.

Путей решения вижу 2, но оба каких-то кривых.
Вариант 1:
в цикле Пока ТипТэга = 1 Цикл делать ХМЛ.ТекущийЭлементВВидеСтроки(), потом создавать новый объект ХМЛ-анализатора, связывать его со строкой, обходить по узлам новый объект.

Вариант 2:
в цикле Пока ТипТэга = 1 Цикл делать ХМЛ.ТекущийЭлементВВидеОбъекта() - но на больших ХМЛках мы будем точно так же пытаться построить ДОМ-объект с падением 1Ски в виде закономерного итога.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: ХМЛ
Ответ #1 - 14. Июня 2011 :: 10:47
Печать  
ЗЫ должен же быть какой-то стандартный мелкософтовский COM-объект для обхода ХМЛок?
кажется, на http://www.script-coding.info/ была какая-то статья на эту тему - но он лежит Печаль
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ХМЛ
Ответ #2 - 14. Июня 2011 :: 11:00
Печать  
[quote]ЗЫ должен же быть какой-то стандартный мелкософтовский COM-объект для обхода ХМЛок?[/quote]
DOMDocument:

[font=Courier New]      DOM = CreateObject("MSXML2.DOMDocument.4.0");
     DOM.Async = 0;
     DOM.ValidateOnParse = 0;

     SchemaCache = CreateObject("MSXML2.XMLSchemaCache.4.0");
     SchemaCache.Add("", КаталогИБ() + "ExtForms\XSD\myschema.xsd");
     DOM.Schemas = SchemaCache;[/font]

И т.д.

А скрипт-кодинг [url=http://www.script-coding.com/]переехал[/url].
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: ХМЛ
Ответ #3 - 15. Июня 2011 :: 02:52
Печать  
DOMDocument, я так понимаю, тоже разворачивает в памяти ХМЛку в дерево.
Есть практика применения его на файлах, хотя бы метров в 25 объемом?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ХМЛ
Ответ #4 - 15. Июня 2011 :: 05:53
Печать  
Satans Claws писал(а) 15. Июня 2011 :: 02:52:
Есть практика применения его на файлах, хотя бы метров в 25 объемом?

Лично у меня? Нет. Обычно - до 5 мегабайт. Но что-то мне подсказывает, что 99% библиотек для работы с XML под Windows основаны на DOMDocument разных версий.  Круглые глаза
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: ХМЛ
Ответ #5 - 15. Июня 2011 :: 08:32
Печать  
berezdetsky писал(а) 15. Июня 2011 :: 05:53:
Satans Claws писал(а) 15. Июня 2011 :: 02:52:
Есть практика применения его на файлах, хотя бы метров в 25 объемом?
Но что-то мне подсказывает, что 99% библиотек для работы с XML под Windows основаны на DOMDocument разных версий.  Круглые глаза


Вот та же фигня.
ХМЛ-анализатор в В7+, судя по всему, на этом "MSXML2.DOMDocument.4.0" и построен...

  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ХМЛ
Ответ #6 - 18. Марта 2012 :: 13:38
Печать  
Satans Claws писал(а) 14. Июня 2011 :: 10:47:
ЗЫ должен же быть какой-то стандартный мелкософтовский COM-объект для обхода ХМЛок?

По вашим заявкам: http://www.1cpp.ru/forum/YaBB.pl?num=1332077808
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: ХМЛ
Ответ #7 - 19. Марта 2012 :: 08:12
Печать  
Упс... "будьте осторожнее в своих желаниях"©

Ту задачу, ради которой задумывался универсальный класс, решил классом-ориентированным-на-задачу.
А заниматься универсальным классом сейчас - это фиг знает, когда руки до него дойдут Улыбка)
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ХМЛ
Ответ #8 - 20. Марта 2012 :: 19:56
Печать  
Satans Claws писал(а) 19. Марта 2012 :: 08:12:
Упс... "будьте осторожнее в своих желаниях"©

Это точно Улыбка

Цитата:
Ту задачу, ради которой задумывался универсальный класс, решил классом-ориентированным-на-задачу.
А заниматься универсальным классом сейчас - это фиг знает, когда руки до него дойдут Улыбка)

Ну, не обязательно завтра лететь в Австралию; просто приятно, когда есть возможность в любое время взять билет.
А так, xmllite - это уже мой класс-ориентированный-на задачу. Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать