繁体   English   中英

从嵌套的hashmap中检索值

[英]retrieving the values from the nested 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>

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

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

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

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

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

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

现在你可以说:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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