Страница 1 из 1
Загрузка XML в очередь
Добавлено: 18 Март 2022, 9:45
Игорь Столяров
Привет всем !
В штатном классе Clarion есть метод для загрузки данных в очередь из XML файла:
Код: Выделить всё
If FromXMLFile(QueueXML,FileNameXML,'RootTag','RowTag',,DOMStyle:ADO_26) ...
Подскажите пожалуйста, а есть аналогичный метод для загрузки в очередь из строки с XML ?
Описания нет, в исходниках как-то всё запутанно. Может кто-нибудь уже сталкивался ...
Заранее спасибо !

Загрузка XML в очередь
Добавлено: 18 Март 2022, 9:51
SergioRaguzini
Приветствую!
CapeSoft xFiles - там такое есть (вроде где то был на FTP)
Загрузка XML в очередь
Добавлено: 18 Март 2022, 9:52
Губин Игорь
AnyScreen:XMLToQueue
Transforms a properly formatted XML structure to a Clarion QUEUE.
Prototype
AnyScreen:XMLToQueue PROCEDURE
(STRING pString, *QUEUE pQueue),BYTE
Parameters
pString
A properly formatted XML structure (return value from the AnyScreen:QueueToXML function)
pQueue
Name of a GROUP structure which you wish to populate.
Return value: BYTE
Returns 0 if the input string is not properly formatted.
Returns 2 if there is a record in the XML which does not match any QUEUE variable by name.
Returns 1 if there is no error.
Example
In the following example we use the AnyScreen:GroupToXML and AnyScreen:XMLToGroup functions to move
data between Server and Client.
Suppose that you want to populate a Browse Queue with a list of client-side printers.
To do so, you would need to modify the NetClient.app (see AnyScreen:ExecuteClientSource). In the appropriate
section of the NetClient.app you could use the following code:
IF Var1='GetPrinterQ'THEN
! Write your own code here to get a list of client printers, put them in a Queue, e.g. PrintersQ
RETURN AnyScreen:QueueToXML(PrintersQ) !This will pass the printer queue back to the server-side app
END
In your application you could use the following code:
ClientPrintersQ QUEUE
PrinterQXML CSTRING(255)
CODE
IF AnyScreen:Active THEN
PrinterQXML = AnyScreen:ExecuteClientSource('GetPrinterQ')
END !IF
AnyScreen:XMLToQueue(PrinterQXML, ClientPrintersQ)
The ClientPrintersQ should now contain a list of Client-side printers.
See also
AnyScreen:GroupToXML
AnyScreen:XMLToGroup
AnyScreen:QueueToXML
Загрузка XML в очередь
Добавлено: 18 Март 2022, 10:10
Игорь Столяров
SergioRaguzini писал(а): 18 Март 2022, 9:51
CapeSoft xFiles - там такое есть (вроде где то был на FTP)
Спасибо - да, знаю.
Здесь как раз таки хотелось бы упростить код, а не наоборот.
Сейчас строку XML приходится записывать в файл для загрузки в очередь.
Более чем уверен, что штатный класс XML умеет это делать одной командой ... надо просто разобраться как.

Загрузка XML в очередь
Добавлено: 18 Март 2022, 10:24
Губин Игорь
В стандартном всё просто. Достаточно дописать функцию в класс (файлы cpxml).
Берётся стандартный FromXMLFile, переименовывается и в нём заменяется вызов XMLFiletoDOM на XMLStringtoDOM
Загрузка XML в очередь
Добавлено: 18 Март 2022, 10:45
Игорь Столяров
Губин Игорь писал(а): 18 Март 2022, 10:24
переименовывается и в нём заменяется вызов XMLFiletoDOM на XMLStringtoDOM
Спасибо. Это интересно и в правильном направлении ... Буду смотреть

В принципе, распарсить строку не сложно в цикле, как учил Юрий ...

Тут просто хочется сделать без наворотов.
Загрузка XML в очередь
Добавлено: 18 Март 2022, 14:30
Игорь Столяров
Губин Игорь писал(а): 18 Март 2022, 10:24
Берётся стандартный FromXMLFile
Ещё раз спасибо, всё прекрасно получилось.
Хотя, конечно, я удивлён, что нет такого метода в XML классе.
У меня получился вот так:
Код: Выделить всё
FromXMLString PROCEDURE(*queue que, *string StrXML , string root, string label) !,byte
XMLDoc &Document,Auto
xRValue Byte(False)
Code
XMLDoc &= XMLStringToDOM(StrXML)
If ~(XMLDoc &= NULL)
xRValue = DOMToQueue(XMLDoc,que,root,label)
XMLDoc.release()
end
Return xRValue
И кстати ! У этого метода нет проблем с русской кодировкой в C63, в отличии от FromXMLFile ...
