On Sun, 2006-07-30 at 17:16 -0400, rjn wrote:
> Hey Everyone,
>
> Thank you for the responses to my previous e-mail. I see that that
> NodeCreateRule would work.
>
> However, I'm wondering how to use it. This is my first time parsing
> XML, so please excuse my ignorance.
>
> So, here's what I have:
>
> Digester d = new Digester();
>
> d.push(this);
>
> d.addCallMethod("feed/entry", "addEntry", 2);
> d.addCallParam("feed/entry/title", 0);
> d.addCallParam("feed/entry/content/div", 1);
It looks like you've got a "factory" method that creates entries:
public void addEntry(String title, String div) {
Entry e = new Entry(title, div);
this.entries.add(e);
}
You could rewrite like this:
public void addEntry(String title, Node div) {
String divText = ....; // serialize node to string
Entry e = new Entry(title, divText);
this.entries.add(e);
}
in which case you need these rules:
// creates a dom Node representing the div and its content, and
// push it onto the object stack
d.addNodeCreate("feed/entry/content/div");
// set param #1 of the method call to the top object on the stack
d.addCallParam("feed/entry/content/div", 1, 0);
However I would recommend instead that you create the Entry object from
an ObjectCreateRule. Your main class therefore has:
public void addEntry(Entry e) {
this.entries.add(e);
}
and the Entry class is:
public class Entry {
private String title;
private String divText;
public void setDiv(Node div) {
divText = ...; // serialize node to string
}
// other getters, setters, etc
}
with:
// for each entry tag, create an Entry object and push it onto
// the digester stack. Also pass this object to the addEntry
// method of the preceding object on the stack.
d.addObjectCreate("feed/entry", Entry.class);
d.addSetNext("feed/entry", "addEntry");
// when the title tag is found, call setTitle on the top object
// on the stack (ie the Entry object created by the earlier
// ObjectCreateRule.
d.addCallMethod("feed/entry/title", "setTitle", 0);
// create a dom NODE and push it onto the stack, then pass
// it to the setDiv method of the parent object on the
// stack (the Entry object)
d.addNodeCreate("feed/entry/content/div");
d.addSetNext("feed/entry/content/div", "setDiv");
Of course this is all untested...
Regards,
Simon
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]