извлечение значений из вложенного hashmap - PullRequest
0 голосов
/ 08 мая 2011

У меня есть 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-файла.Я использовал следующую структуру:

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

Это неудобно для использования в программе.Пожалуйста, предложите решение, но не говорите, что итераторы доступны.Поскольку я должен получить индивидуальное значение с карты в соответствии с потребностями моей программы.

РЕДАКТИРОВАТЬ: моя программа должна получить идентификаторы отдела, для которого есть право отправлять письма, а затем эти идентификаторысравниваются с идентификаторами в файле XML.Только информация этих идентификаторов извлекается из XML, который в сравнении возвращает true.Это все моя программа.Пожалуйста, помогите.

Заранее спасибо, Вишу

Ответы [ 2 ]

2 голосов
/ 08 мая 2011
  1. Никогда не приводить к конкретной реализации карты.Лучше использовать приведение к интерфейсу карты, т.е. ((Map)one.get("foo")).get("bar")

  2. Не используйте приведение в вашем случае.Вы можете определить коллекцию, используя дженерики, так что компилятор сделает работу за вас:

    Картаодин = новый HashMap();

    Картадва = новый HashMap();

Теперь вы можете сказать:

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

Без кастинга, без проблем.

Но лучшеРешение не использовать вложенные таблицы вообще.Создайте свои собственные классы, такие как SelectColumns, WhereCondition и т. Д. Каждый класс должен иметь соответствующие частные поля, методы получения и установки.Теперь проанализируйте ваш XML, создавая экземпляр этих классов.А затем используйте геттеры для обхода структуры данных.

Кстати, если вы хотите использовать JAXB, вам не нужно делать почти ничего!Примерно так:

Unmarshaller u = JAXBContext.newInstance(SelectColumns.class, WhereCondition.class).createUnmarshaller();
SelectColumns[] columns = (SelectColumns[])u.unmarshal(in);
0 голосов
/ 08 мая 2011

Один из подходов заключается в создании полностью определенных ключей, которые содержат XML-путь к элементу или атрибуту.Эти ключи будут уникальными, хранятся в одной хэш-карте и быстро доставят вас к элементу.

Ваш код должен будет просто сгенерировать уникальное текстовое представление пути и сохранить и извлечь элемент xml на основе ключа..

...