2011-05-08 187 views
0

我有如下表节点结构的许多拷贝的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路径完全合格的键

+0

您是否尝试过使用xpath? – Kaj 2011-05-08 17:28:42

+0

@Kaj - 我如何使用xpath? – Vishu 2011-05-09 15:20:47

回答

0

一种方法。这些密钥将是唯一的,存储在一个单独的hashmap中,并快速获取元素。

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

2
  1. 从未投射到特定的Map实现。更好地使用铸造到地图界面,即 ((Map)one.get("foo")).get("bar")

  2. 不要在您的情况下使用铸造。您可以使用泛型集合定义,所以编译器会为你做的工作:

    地图<字符串,地图>一个=新的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); 
+0

@ AlexR-请问我有关在我的程序中使用自定义类的想法吗? – Vishu 2011-05-09 15:02:33

+0

请你回答...我没有办法继续我的计划。 – Vishu 2011-05-10 15:01:11