Sorry but this is a long message.
I am trying to output a number of XML messages using the %XML.Writer class.
I am using version 5.0.8. of Cache. I had schemas of the messages I want to
create so I created my classes by importing the schemas. There is one
outer wrapper message that I am trying to create. The message contains an
element which repeats. The schema import creates these with "Collection =
list " against the property. This element is a place holder for the
payload XML message content to be inserted into it. The element has a
property called any and the import has defined it as %XML.String with an
XMLPROJECTION of "ANY" and [ SqlFieldName = _any ] on the end. So the
purpose of this property is to be able to contain another XML message (of
which there are many types). So the basic message format is:
<wrapper_message>
<payload>
<content_message>
</content_message>
</payload>
<payload>
<another_message>
</another_message>
</payload>
</wrapper_message>
Where payload is the repeating property and the any property is the content
messages. Another requirement I have to cope with is that the contents
messages have their own namespace definitions that I wish to output. Using
the classes that have been generated, to create a new payload message I do
the following:
s status=wrapper.payload.InsertAt(##class(package.payload).%New(),1)
s wrapper.payload.GetAt(1).any=##class(package.messagename).%New()
but when I do a
s status=XMLWriter.RootObject(wrapper)
I just get:
<?xml version="1.0" encoding="UTF-8"?>
<wrapper>
<payload>
[EMAIL PROTECTED]
</payload>
<payload>
[EMAIL PROTECTED]
</payload>
</wrapper>
i.e. the payload content just comes out as the object reference and
assumming I could get the message rather than the reference coming out I
still don't know how I would get the namespace definitions to come out on
each of the content messages.
I have tried splitting it into bits of the message, using multiple
XML.Writer's to write out the separate bits and it nearly works. I have to
do a RootElement method to write out the wrapper start tag, another
RootElement method (with another writer) to write out the start payload tag,
then with another writer do a RootObject on the first message content, then
do an EndRootElement to write the end payload tag, repeate RootElement,
RootObject and EndRootElement for the next payload message, then use an
EndRootElement to close the wrapper message tag. Plus there is still a
problem in that when I use the RootElement method, non of it's attached
attributes come out.
But the code doesn't feel right anyway, it feels like I'm going all round
the houses just to arrive next door. It's not just using the Writer, it's
also the setting of the object references. I find that I have to create new
references for all the sub-objects of an object, so if I have a class called
person, which has a property called address, which is itself an object with
properties I have to create a new instance of person, then create a new
instance of address to set to the address property of person. Which creates
tons of code. When I imported my schemas I chose not to have them as
persistant classes as I will never need to store the data, I am just using
them to create XML messages and read them in. If I had imported the
messages and selected to have persistant classes, if I created a new
instance of person, would the address object then be automatically
instantiated, so I could just start setting the sub-object's properties
without creating it?
So, I have a few problems:
Is the definition of the XML classes the most suitable for what I want or
would they be better another way?
How would be the best way to use the XML.Writer to try to easily achieve
what I want?
Should I re-import my schemas and choose persistant classes?
Is it really going to save me time using these new-fangled contraptions,
like classes and XML.Writers or would it be quicker and easier constucting
the output using the good old WRITE command?
If you can answer any of my problems I'd be most thankful.
thanks
Wendy Griffiths