从嵌套的hashmap中检索值

时间:2011-05-08 16:53:24

标签: java xml key hashmap

我有一个包含许多表节点结构副本的XML文件,如下所示:

<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>

由于每次遍历文件以获取程序中查询的每个节点的详细信息不是一种有效的方式,我使用嵌套的hashmap概念来存储第一次XML文件时的详细信息。我使用的结构如下:

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’

但我现在面临的问题是使用嵌套键检索Value部分。例如,

如果我需要Slno Key的值,我必须以嵌套的形式指定TblID,SelectColumns,Slno,如:

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

这在程序中使用是不合理的。请提出解决方案,但不要告诉迭代器可用。因为我要根据我的程序的需要从地图中获取单个值。

编辑:我的程序必须获取有权发送邮件的部门的ID,然后将这些ID与XML文件中的ID进行比较。只从XML中获取这些ID的信息,这些信息在比较时返回true。这是我的全部计划。请帮忙。

提前致谢, Vishu

2 个答案:

答案 0 :(得分:2)

  1. 从不转发到特定的Map实现。更好地使用转换到Map接口,即 ((Map)one.get("foo")).get("bar")

  2. 请勿在您的情况下使用铸造。您可以使用泛型定义集合,因此编译器将为您工作:

    Map&lt; String,Map&gt; one = new HashMap&lt; String,Map&gt;();

    Map&lt; String,Integer&gt; two = new HashMap&lt; String,Integer&gt;();

  3. 现在你可以说:

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

    没有铸造,没有问题。

    但更好的解决方案是根本不使用嵌套表。创建自定义类,如SelectColumnsWhereCondition等。每个类都应该有适当的私有字段,getter和setter。现在解析这些类的XML创建实例。然后使用getter遍历数据结构。

    顺便说一句,如果您想使用JAXB,您几乎不需要做任何事情!如下所示:

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

答案 1 :(得分:0)

要采取的一种方法是生成包含元素或属性的XML路径的完全限定键。这些键是唯一的,存储在单个散列映射中,可以快速访问元素。

您的代码只需生成路径的唯一文本表示,并根据密钥存储和检索xml元素。