I think I wasn't very clear about my problem - the Contact bean itself has a
hashmap, and "RowId" and "LastName" act as fields there. Here's the full
source just to eliminate all confusion:
public class Contact {
// Actual bean contains 30+ fields,
// omitted for simplicity sake
private Map fields = new HashMap();
// Field name constants to use with get()
public static final String ROW_ID = "RowId";
public static final String LAST_NAME = "LastName";
public String get(String name) {
return (String) fields.get(name);
}
public void set(String name, String value) {
fields.put(name, value);
}
public void populate(String xml) throws Exception {
Digester d = new Digester();
// *********************************
// Now what to put there for rules??
// *********************************
digester.push(this);
digester.parse(new StringReader(xml));
}
public static void main(String[] args) throws Exception {
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<Contact>" +
"<RowId>1</RowId>" +
"<LastName>1</LastName>" +
"</Contact>";
Contact c = new Contact();
c.populate(xml);
// What I want to get is two entries in "fields" hashmap,
// ("RowId", "1") and
// ("LastName", "Smith")
}
}
Now, the SetProperty rule doesn't work there, because it operates on tag
attributes, not on the tag itself - again, unless I'm missing some obscure
parameter combination that make it work in a different way...
Tried CallMethod rule, too, and CallParam seem to be unable to pick up the
tag name (e.g., "RowId") as a parameter value
Any other ideas?
Thanks,
Alex
-----Original Message-----
From: Martin Kersten [mailto:[EMAIL PROTECTED]
Sent: Tuesday, March 02, 2004 9:19 AM
To: Jakarta Commons Users List
Subject: Re: [Digester] Parsing XML to a hashtable
Hi,
> I have a HashMap-based java bean that I'm trying to populate from an XML
> file. Now, the only accessors java bean exposes are get(String) and
> set(String, String), and XML file contains its data in body text, like
that:
>
> <Contact>
> <RowId>1</RowId>
> <LastName>Smith</LastName>
> </Contact>
>
> Now, while the whole setup looks fairly common, it doesn't look like
there's
> an easy way to parse it... I tried the CallMethod rule, but apparently it
> can accept parameters from pretty much anywhere - from body text, tag
> attribute, even the tag node up the stack - except from the tag name
itself!
> Am I missing something there?
>
> Thanks in advance,
Check the addSetProperty method. Should help you, I guess. If not
compose the contact using a bean and add it to your map represented
by the next xml level tag (like <contacts>) using addSetNext(..).
Example:
addCreateObject("*/contact", Contact.class);
... (initialize the contact rowId and lastName properties using
addSetProperties)
addSetNext("*/contact","addContact");
+ top level (or next higher level).
addCreateObject("contacts", ContactMap.class);
//add method
contacts.addContact(Contact contact) {
if(contact.isValid())
contactMap.set(contact.getRowId(), contact.getLastName());
}
I think you can guess the meaning of it.
Summary: Try addSetProperty rule first. If it is not working try the
second approach.
Bye,
Martin (Kersten)
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]