[Oberon] XML Components
Yaroslav Romanchenko
tobject at bk.ru
Sun Mar 14 13:42:12 MET 2010
Hi, Community!
I've made some XML components hierarchy.
E.g. there's component-container named DrakonDocument. It may has several instances of other child containers named DrakonSchema.
Every DrakonSchema container may has only elements (not containers) named DrakonElementHead, DrakonElementAction, ... and so on.
Then I've built at runtime simple document and stored it to XML successfully.
But when I try to deserialize XML back to component structure in memory it seems fails.
At first I've tried to make repository, load it and then load XML. Without success...
Actually, then I've tried experiment with standard repository too, but result is strange:
Repositories.Load Standard ~
Loading repository 'Standard' ... done.
TestComponents.Test Button ~
Component 'Button' not found
Is it bug???
Then I've rewrote code of WMComponents.Load such way to use own instance of ElementRegistry:
PROCEDURE RegisterAndLoad*(CONST filename: ARRAY OF CHAR; VAR document: DrakonComponents.DrakonDocument);
VAR
content: XML.Content;
registry: XML.ElementRegistry;
name: Strings.String;
BEGIN
(* Try to register elements' generators *)
NEW(registry);
registry.RegisterElementByName("DrakonDocument", "DrakonComponents", "GenDrakonDocument");
registry.RegisterElementByName("DrakonSchema", "DrakonComponents", "GenDrakonSchema");
registry.RegisterElementByName("DrakonElementHead", "DrakonComponents", "GenDrakonElementHead");
registry.RegisterElementByName("DrakonElementAction", "DrakonComponents", "GenDrakonElementAction");
registry.RegisterElementByName("DrakonElementEnd", "DrakonComponents", "GenDrakonElementEnd");
registry.RegisterElementByName("DrakonElementNode", "DrakonComponents", "GenDrakonElementNode");
document := NIL;
content := LoadWithRegistry(filename, registry);
IF content # NIL THEN
KernelLog.String("xml loaded!");
KernelLog.Ln
END;
IF content IS XML.Element THEN
name := content(XML.Element).GetName();
KernelLog.String(name^);
KernelLog.Ln
END;
IF content IS DrakonComponents.DrakonDocument THEN
KernelLog.String("content IS DrakonComponents.DrakonDocument");
KernelLog.Ln;
document := content(DrakonComponents.DrakonDocument)
END
END RegisterAndLoad;
It produces output:
xml loaded!
DrakonDocument
So, the root element of XML is XML.Element and element's name is correct, but element isn't of DrakonComponents.DrakonDocument type.
Modules attached below.
To create XML, execute: DrakonTest.TestCreate schema.XML ~
To load: DrakonTest.TestLoad schema.XML ~
---
Cheers, SAGE
http://sage.com.ua/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Drakon.zip
Type: application/zip
Size: 3812 bytes
Desc: not available
Url : https://lists.inf.ethz.ch/pipermail/oberon/attachments/20100314/5a5d0b8a/Drakon.zip
More information about the Oberon
mailing list