First I'd suggest not to use a persistent class "linked" to a message (Ens.Response in this case), Supplier is linked by your message class in this case.
If you do it, you will definitely create "orphaned" persistent objects when you purge, unless you add some logic (like triggers and callbacks) to delete the "linked" persistent objects when a message is purged.
To avoid this (when possible) a serial class is preferred.
So, the Supplier class would be:
Class Community.App.Msg.Supplier Extends (%SerialObject, %XML.Adaptor)
{
Property row As%Integer;
}As for the message class:
Class Community.App.Msg.Suppliers Extends Ens.Response
{
Property Supplier As list Of Community.App.Msg.Supplier(XMLPROJECTION = "ELEMENT");ClassMethod test() As%Status
{
set XmlString="<Suppliers><Supplier><row>1</row></Supplier><Supplier><row>2</row></Supplier></Suppliers>"set reader = ##class(%XML.Reader).%New()
$$$ThrowOnError(reader.OpenString(XmlString))
do reader.CorrelateRoot("Community.App.Msg.Suppliers")
do reader.Next(.Suppliers, .tSC)
do Suppliers.XMLExport(,",indent")
quit tSC
}
}For simplicity I modified the sample to be a classmethod.
When the test() method is run the output is:
EPTEST>d ##class(Community.App.Msg.Suppliers).test()
<Suppliers>
<Supplier>
<row>1</row>
</Supplier>
<Supplier>
<row>2</row>
</Supplier>
</Suppliers>The relevant documentation is "Controlling the Form of the Projection for Collection Properties" here.
Let me add a few notes.
If a class extend Ens.Response or Ens.Request is not necessary to extend %Persistent because is already inherited by Ens.Request/Ens.Response.
Edit: please see Antoine commnet below
If the desired XML tag correspond to the class name (without package), it is not necessary to add the XMLNAME parameter, like you did in App.Objects.Suppliers class.
Same goes for XMLNAME property parameter XMLNAME = "row" is not necessary because the property name correspond to the desired XML tag name.
- Log in to post comments
.png)