Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JAXB, How update and add item ? 
V
    Опции темы
lat
Дата 30.6.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



xml документ:

Код

<addressBook>
    
    <contact>
        <name>John Doe</name>
        <email>[email protected]</email>
    </contact>

    <contact>
        <name>Jane Smith</name>
        <email>[email protected]</email>
    </contact>
    
    <contact>
        <name>Bob Cole</name>
        <email>[email protected]</email>
    </contact>
</addressBook>



Читаю так:

Код

static void showNames() throws Exception {
       
        JAXBContext  jaxbContext = JAXBContext.newInstance("contact"); 
        Unmarshaller um         = jaxbContext.createUnmarshaller();

        // set up a parser
        XMLInputFactory xmlif = XMLInputFactory.newInstance();
        XMLStreamReader xmlr  = xmlif.createXMLStreamReader(new FileReader(fileName));
 
        //    move to the root element and check its name.
        xmlr.nextTag(); 
        xmlr.require(START_ELEMENT, null, "addressBook");

        xmlr.nextTag(); // move to the first <contact> element.
        while (xmlr.getEventType() == START_ELEMENT) {

            // unmarshall one <contact> element into a JAXB Contact object
            xmlr.require(START_ELEMENT, null, "contact");
            Contact contact = (Contact) um.unmarshal(xmlr);
            System.out.println(contact.getName());
            
            if (xmlr.getEventType() == CHARACTERS) {
             xmlr.next(); // skip the whitespace between <contact>s.
            }
        
        }        
    }


Создаю так:

Код

    static void create(String name, String email) {
        try {
         
         JAXBContext jContext = JAXBContext.newInstance("contact");
            System.out.println("context ok");
            
            ObjectFactory factory = new ObjectFactory();
            AddressBook  addressBook =(AddressBook)(factory.createAddressBook());
            
            Contact  contact =(Contact)(factory.createContact());
            contact.setEmail("asd");
            contact.setName("asd");
            java.util.List journalList = addressBook.getContact();
            journalList.add(contact);
            
            
            Marshaller marshaller=jContext.createMarshaller();
            System.out.println("marshaller  ready");
            marshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
            marshaller.marshal(addressBook, new FileOutputStream("contact.xml"));                      
            System.out.println("java tree converted into xml & filed");
            
        } catch (Exception ex) {
         System.out.println(ex);  
        }
  
    }


Внимание вопрос!
Как добавить или обновить существующую запись? =)
Как например поменять "Jane Smith" на "Agent Smith" ?


Это сообщение отредактировал(а) lat - 30.6.2009, 11:21
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
powerOn
Дата 30.6.2009, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



JAXB способен преобразовать модель (т.е. связанные объекты) в XML представление и обратно. Очевидно, что имея XML представление нужно преобразовать его в модель, изменить модель, а потом преобразовать её обратно в XML представление.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
lat
Дата 30.6.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



powerOn, спасибо! Реализовал то что Вы посоветовали, и таки работает!)

Вот код (думаю что пригодится подрастающему поколению, мне не жалко =) :

Код

static void setEmail(String nameToLookFor, String email) throws Exception {
       
        JAXBContext jc = JAXBContext.newInstance( "contact" );
        
        Unmarshaller u = jc.createUnmarshaller();

        AddressBook po  = (AddressBook)u.unmarshal( new FileInputStream( fileName ));

        List address    = po.getContact();        
        for (ListIterator i = address.listIterator();i.hasNext();)    {
         Contact myContact =(Contact)i.next();
         if (myContact.getName().equals(nameToLookFor)) {
           myContact.setEmail(email);
         }    
        }
        
        Marshaller marshaller = jc.createMarshaller();        
        marshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
        marshaller.marshal(po, new FileOutputStream("contact.xml"));                                 
    }



Созрел тогда другой вопрос, но по этой же теме:

Если придется работать с  файлами больших размеров, и нужно будет обновлять множество записей и в разных "уголках" документа. 
JAXB справится с такой нагрузкой, используя указанную выше схему обновления записей ?
И сколько ему понадобится системный ресурсов?



Это сообщение отредактировал(а) lat - 30.6.2009, 12:43
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
lat
Дата 30.6.2009, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цырк )))

vingrad для меня, уже в качестве репозитория выступать начал)))
Случайно снес папку с сорцами, и восстанавливал её по своим постам в этой теме =)






Это сообщение отредактировал(а) lat - 30.6.2009, 13:42
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0432 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.