简体   繁体   中英

retrieving the values from the nested hashmap

I have a XML file with many copies of table node structure as below:

<databasetable TblID=”123” TblName=”Department1_mailbox”>
<SelectColumns>
    <Slno>dept1_slno</Slno>
    <To>dept1_to</To>
    <From>dept1_from</From>
    <Subject>dept1_sub</Subject>
    <Body>dept1_body</Body>
    <BCC>dept1_BCC</BCC>
    <CC>dept1_CC</CC>
</SelectColumns>
<WhereCondition>MailSentStatus=’New’</WhereCondition>
<UpdateSuccess>
    <MailSentStatus>’Yes’</MailSentStatus>
    <MailSentFailedReason>’Mail Sent Successfully’</MailSentFailedReason>
</UpdateSuccess>
<UpdateFailure>
    <MailSentStatus>’No’</MailSentStatus>
    <MailSentFailedReason>’Mail Sending Failed ’</MailSentFailedReason>
</ UpdateFailure>
</databasetable>

As it is not an efficient manner to traverse the file for each time to fetch the details of each node for the queries in the program, I used the nested hashmap concept to store the details while traversing the XML file for the first time. The structure I used is as below:

MapMaster
Key     Value
123     MapDetails
        Key         Value
        TblName         Department1_mailbox
        SelectColumns       mapSelect
                    Key         Value
                    Slno            dept1_slno
                    To          dept1_to
                    From            dept1_from
                    Subject         dept1_sub
                    Body            dept1_body
                    BCC         dept1_BCC
                    CC          dept1_CC
        WhereCondition      MailSentStatus=’New’
        UpdateSuccess       mapUS
                                    MailSentStatus      ’Yes’
                                    MailSentFailedReason    ’Mail Sent Successfully’
        UpdateFailure       mapUF
                                    MailSentStatus      ’No’
                                    MailSentFailedReason    ’Mail Sending Failed’

But the problem I'm facing now is regarding retrieving the Value part using the nested Keys. For example,

If I need the value of Slno Key, I have to specify TblID, SelectColumns, Slno in nested form like:

Stirng Slno = ((HashMap)((HashMap)mapMaster.get(“123”))mapDetails.get(“SelectColumns”))mapSelect.get(“Slno”);

This is unconvinent to use in a program. Please suggest a solution but don't tell that iterators are available. As I've to fetch the individual value from the map according to the need of my program.

EDIT:my program has to fetch the IDs of the department for which there is privilege to send mails and then these IDs are compared with the IDs in XML file. Only information of those IDs are fetched from XML which returned true in comparison. This is all my program. Please help.

Thanks in advance, Vishu

  1. Never cast to specific Map implementation. Better use casting to Map interface, ie ((Map)one.get("foo")).get("bar")

  2. Do not use casting in your case. You can define collection using generics, so compiler will do work for you:

    Map<String, Map> one = new HashMap<String, Map>();

    Map<String, Integer> two = new HashMap<String, Integer>();

Now your can say:

int n = one.get("foo").get("bar");

No casting, no problems.

But the better solution is not to use nested tables at all. Create your custom classes like SelectColumns , WhereCondition etc. Each class should have appropriate private fields, getters and setters. Now parse your XML creating instance of these classes. And then use getters to traverse the data structure.

BTW if you wish to use JAXB you do not have to do almost anything! Something like the following:

Unmarshaller u = JAXBContext.newInstance(SelectColumns.class, WhereCondition.class).createUnmarshaller();
SelectColumns[] columns = (SelectColumns[])u.unmarshal(in);

One approach to take would be to generate fully qualified keys that contain the XML path to the element or attribute. These keys would be unique, stored in a single hashmap and get you to the element quickly.

Your code would simply have to generate a unique textual representation of the path and store and retrieve the xml element based on the key.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM