XMLWriter question

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

XMLWriter question

Stéphane Ducasse
Hi guys

I have a question about XMLWriter. I have cards and group of cards.
Each class know how to serialize itself.

For card I have xmlOn: (one of my methods) that describes the card attributes

Card>>xmlOn: aWriter
        "write a description of the receiver properties as xml uing aWriter, an instance of XMLWriter"
       
        aWriter tag
                name: #card;
                with: [self xmlInstVarOn: aWriter]
       

Group>>xmlOn: aWriter
        "write a description of the receiver properties as xml uing aWriter, an instance of XMLWriter"
       
        | cardWriter |
        cardWriter := XMLWriter new.
        cards do: [:each | each xmlOn: cardWriter].
       
        aWriter tag
                name: #group;
                with: [
                        aWriter tag: #groupName with: self groupName.
                        aWriter tag: #cards with: [ aWriter raw:  cardWriter contents]]
       
       
And I'm not really happy. Because I would like to avoid to use raw: and instantiate a new writer.

I would like to know how I could use the write to pass the results of the iteration over cards
I wanted to write something like

        aWriter tag
                name: #group;
                with: [
                        aWriter tag: #groupName with: self groupName.
                        aWriter tag: #cards with: [self cards do: [:each | each xmlOn: aWriter]]








Reply | Threaded
Open this post in threaded view
|

Re: XMLWriter question

Gary Chambers-4
Not sure what the current XMLParser api is like but this is a snippet of
what we used in Squeak for ReportBuilder...


toXMLWriter: aWriter
 "Populate the writer from the receiver."

 |e pt |
 e := super toXMLWriter: aWriter.
 self @ #repeat ifNotNilDo: [:b | e attributeAt: #repeat put: (b ifTrue:
['repeat'] ifFalse: ['no-repeat'])].
 self @ #direction ifNotNilDo: [:s | e attributeAt: #direction put: (s =
#leftToRight ifTrue: ['lr'] ifFalse: ['tb'])].
 pt := XMLElement named: 'printThings'.
 e addElement: pt.
 self items do: [:i |
  aWriter element: pt.
  i toXMLWriter: aWriter].
 ^e

Regards, Gary

----- Original Message -----
From: "Stéphane Ducasse" <[hidden email]>
To: "pharo Development" <[hidden email]>
Cc: "Moose-related development" <[hidden email]>
Sent: Monday, February 21, 2011 8:58 AM
Subject: [Pharo-project] XMLWriter question


Hi guys

I have a question about XMLWriter. I have cards and group of cards.
Each class know how to serialize itself.

For card I have xmlOn: (one of my methods) that describes the card
attributes

Card>>xmlOn: aWriter
"write a description of the receiver properties as xml uing aWriter, an
instance of XMLWriter"

aWriter tag
name: #card;
with: [self xmlInstVarOn: aWriter]


Group>>xmlOn: aWriter
"write a description of the receiver properties as xml uing aWriter, an
instance of XMLWriter"

| cardWriter |
cardWriter := XMLWriter new.
cards do: [:each | each xmlOn: cardWriter].

aWriter tag
name: #group;
with: [
aWriter tag: #groupName with: self groupName.
aWriter tag: #cards with: [ aWriter raw:  cardWriter contents]]


And I'm not really happy. Because I would like to avoid to use raw: and
instantiate a new writer.

I would like to know how I could use the write to pass the results of the
iteration over cards
I wanted to write something like

aWriter tag
name: #group;
with: [
aWriter tag: #groupName with: self groupName.
aWriter tag: #cards with: [self cards do: [:each | each xmlOn: aWriter]]