2011-05-08 189 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