powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как унаследоваться от классов пакета %XML?
5 сообщений из 5, страница 1 из 1
Как унаследоваться от классов пакета %XML?
    #37947607
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть задача, в которой использую %XML.Reader.
Примерно так:
Код: sql
1.
2.
3.
4.
	s reader = ##class(%XML.Reader).%New()
	s sc = reader.OpenString(str)
	s document  = reader.Document 
	// И дальше работаю с документом через ДОМ


Хотелось бы улучшить класс %XML.Document
Понятно, что велосипед, но нигде не нашел возможности, например, искать следующий(предыдущий) узел с известным именем на одном уровне иерархии и еще несколько тупых возможностей, которые в любом списке есть, а вот в этот класс ИС их добавить забыл (к слову, зато поскольку %XML.Document унаследован зачем-то от %XML.Node, в нем есть туча бесполезных и вылетающих с ошибкой методов типа MoveToParentElement). В общем, чего-то типа FindNextNode(.Node) там нету.

Но если я изготовлю свой класс (Например MYXML.Document) унаследованный от %XML.Document, то мне придется и еще тучу классов пакета %XML переопределять. Например, тот-же %XML.Reader, ибо его свойство Document вернет мне совсем не то, что нужно.

Будете смеяться, но я попробовал конструкцию
Код: sql
1.
2.
3.
	#dim document As MYXML.Document = reader.Document
	s Node = document.GetDocumentElement()
	s sc = document.FindNextNode(Node)

Но вэбэа, как обычно, показал себя не в лучшем свете - ни разу не случилось счастье.

Понятно, что можно работать конструкциями типа
Код: sql
1.
	s sc = ##class(MYXML.Document).FindNextNode(Node)

Но это-ж коряво.

Я тоже понимаю, что на-лету дополнить предка до потомка тоже довольно неряшливо, но очень хотелось бы - это-ж не хранимые объекты все-таки.
...
Рейтинг: 0 / 0
Как унаследоваться от классов пакета %XML?
    #37947823
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тема сообщения "Как унаследоваться от классов пакета %XML?"

а дальше никакого отношения к наследованию только какой то бред о том то IS вам не предоставила инструментов

авторискать следующий(предыдущий) узел с известным именем на одном уровне иерархии и еще несколько тупых возможностей, которые в любом списке есть, а вот в этот класс ИС их добавить забыл
XML это никак не список, и %XML.Reader работает с ним как с потоком, и он перебирает все узлы по очереди

я непонимаю точно вашей задачи, но наверняка она легко решается либо с помощью своего SAX handler , который бы собрал из XML например какую то многомерную структуру, по которой вы потом без труда найдете что вам нужно.

второй вариант, это использование XPath, посмотрите класс %XML.XPATH.Document и примеры в нем
...
Рейтинг: 0 / 0
Как унаследоваться от классов пакета %XML?
    #37948683
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMor,

Меня интересует именно вопрос наследования и именно от классов пакета XML. Интересует примерно раз в полгода.
Каждый раз упираюсь в то, что унаследоваться оттуда если и можно, то только ВСЕМ пакетом - сильное связывание это плохо, но тут, видно, без него нельзя было обойтись. Тут подвернулась очередная проблема, в руках у меня был #dim, а за спиной - открытый форум ;) Про удачность примера ничего сказать не могу - какой уж был, извините.

Вопрос можно обобщить за рамкой xml - как заставить предка вести себя как потомка. Для хранимых объектов я подменяю информацию в узлах хранения, и из предка (с уже заполненными данными) легко получается потомок. Например, на первом этапе обработки я не знаю специфики учета товара и пишу его в класс "Какой-то товар". А в процессе обработки документов выясняется, что учет этого товара специфичен и нужно отнести его к подклассу "Промышленный товар" - это легко делается правкой глобала с данными. Превратить "Продовольственный товар" в "Промышленный" конечно, сложнее (индексы), но сложность тут оправдана отсутствием необходимости в такой операции в предметной области (обычно в этом не должно быть необходимости).

Здесь же мне нужно, получив %XML.Document, заставить его вести себя как его наследника MYXML.Document. Подозреваю, что это сделать нельзя.

Про то, что ИС не предоставило инструментов, я особо не заострял - так, попробовал их в очередной раз взбодрить, а то судя по соседней теме, с плюшками что-то не то, помните:

«Ну и плюшки! Деньги дерёшь, а корицу жалеешь. Берегись!»

Как разобрать xml - какбэ вопрос второй, что это не список, понятно. Но возможности поиска мне, например, не помешали бы. Опять же - я с xml плотно не работаю, в общем-то все проблемы всегда решаются... и эта тоже решится, глядишь и с Вашими подсказками (ща буду штудировать SAX и XPATH).
...
Рейтинг: 0 / 0
Как унаследоваться от классов пакета %XML?
    #37948711
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я пока не совсем понял проблем с наследованием классов пакета XML
пустой чистый класс с одним потомком, тем более не хранимый будет идентичен своему потомку

авторЗдесь же мне нужно, получив %XML.Document, заставить его вести себя как его наследника MYXML.Document. Подозреваю, что это сделать нельзя.Вот тут тоже ничего не понял, и тем более какое это имеет отношение к %XML в целом.
...
Рейтинг: 0 / 0
Как унаследоваться от классов пакета %XML?
    #37948915
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMor,
спасибо, вот это помогает вроде (но нужно xpath еще копать):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	s sc = ##class(%XML.XPATH.Document).CreateFromString(str,.Doc)

	w Doc.EvaluateExpression("/","/invoiceByCarReply/car/doc/invNumber[@value='АР005970']/@value",.out),!
	d ##class(%XML.XPATH.Document).ExampleDisplayResults(out)

	w Doc.EvaluateExpression("/","/invoiceByCarReply/car/doc/invNumber/@value",.out),!
	f i = 1:1:out.Count() {
		s node = out.GetAt(i)
		w node.Value,!
	}


А с наследованием - черт с ним, если вопрос не получился, значит сам не очень понимаю, что нужно ;)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как унаследоваться от классов пакета %XML?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]