从嵌套散列映射检索值
我有如下表节点结构的许多拷贝的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’
但我现在面临的问题是关于使用嵌套Keys检索Value部分。例如,
如果我需要Slno关键的价值,我必须指定TblID,SelectColumns,Slno嵌套形式,如:
Stirng Slno = ((HashMap)((HashMap)mapMaster.get(“123”))mapDetails.get(“SelectColumns”))mapSelect.get(“Slno”);
这是unconvinent在程序中使用。请提出解决方案,但不要告诉迭代器可用。因为我必须根据我的程序需要从地图中获取个别值。
编辑:我的程序必须获取有权发送邮件的部门的ID,然后将这些ID与XML文件中的ID进行比较。只有这些ID的信息是从XML中获取的,相比之下,这些信息才返回true。这是我的全部计划。请帮忙。
由于提前, Vishu采取将生成包含的元素或属性的XML路径完全合格的键
一种方法。这些密钥将是唯一的,存储在一个单独的hashmap中,并快速获取元素。
您的代码只需要生成路径的唯一文本表示,并根据密钥存储和检索xml元素。
从未投射到特定的Map实现。更好地使用铸造到地图界面,即
((Map)one.get("foo")).get("bar")
-
不要在您的情况下使用铸造。您可以使用泛型集合定义,所以编译器会为你做的工作:
地图<字符串,地图>一个=新的HashMap <字符串,地图>();
地图<字符串,整数> two = new HashMap < String,Integer >();
现在你可以说:
int n = one.get("foo").get("bar");
没有铸造,没有问题。
但更好的解决方案是根本不使用嵌套表。创建您的自定义类,例如SelectColumns
,WhereCondition
等。每个类应该有适当的专用字段,获取者和设置者。现在解析你的XML创建这些类的实例。然后使用getters遍历数据结构。
顺便说一句,如果你想使用JAXB,你几乎不需要做任何事情!类似以下内容:
Unmarshaller u = JAXBContext.newInstance(SelectColumns.class, WhereCondition.class).createUnmarshaller();
SelectColumns[] columns = (SelectColumns[])u.unmarshal(in);
您是否尝试过使用xpath? – Kaj 2011-05-08 17:28:42
@Kaj - 我如何使用xpath? – Vishu 2011-05-09 15:20:47