2013-05-13 1 views
0

В моем проекте java мне нужно размонтировать XML-файл, чтобы получить список объектов.Unmarshal измененный файл xml

Unmarshalling работает очень хорошо, но проблема не изменяется, когда содержимое файла изменяется. На самом деле в этом проекте мы можем добавить новое содержимое в этот файл, нажав на «addButon», но когда я хочу размонтировать в другой раз тот же файл (после модификации), я получаю только старый список объектов без последних элементов (у меня есть только добавлен в этот файл).

Я уже проверил физический XML-файл на диске, и я нашел все последнее содержимое, которое я только что добавил. Также я заметил, что единственный способ получить последний список объектов - закрыть приложение и снова открыть его, что непригодно.

Вот кусок кода:

//classe1.java 

File iniFile = new File(proprietesPerle.getRepRef() + "referential.xml"); 

FileInputStream fs = = new FileInputStream(iniFile); 

ref = Referentiel.unmarshal(fs);  

TreeMap map = ReferentielUtil.getApplication(ref); 

... 


//classe2.java 

TreeMap map = new TreeMap(); 

List   listPL = app.getPl(); //this list is unmarshalled from the xml file 

ListIterator itpl = listPL.listIterator(); 

while (itpl.hasNext()) 
{ 

    Pl pl = (Pl)itpl.next(); 

    map.put(pl.getCode(), pl); 
} 

return map; 

... 

Огромное спасибо Игорю за ответ

In fact we select an app from a combobox, it's type is "Application" and this variable is stocked in a session. we use it like this: 

session.setAttribute("selectedApplication",selectedAppli); 
TreeMap mapp = ReferentielUtil.getPl(selectedAppli.getApp()); 

//Class ReferentielUtil.java 
public static TreeMap getPl(Application app) 
{ 
    logger.debug("getPl"); 
    logger.debug("passe 10"); 
    TreeMap map = new TreeMap(); 

    List listPL = app.getPl(); 
    ListIterator itpl = listPL.listIterator(); 
    while (itpl.hasNext()) 
    { 
     Pl pl = (Pl)itpl.next(); 

     map.put(pl.getCode(), pl); 
    } 
    return map; 
} 

inside Referentiel.unmarshal, you will find a code like this: 

public void unmarshal(Unmarshaller u) 
    throws UnmarshalException 
{ 

    XMLScanner xs = u.scanner(); 
    xs.takeStart("application"); 
    while (xs.atAttribute()) { 
     String an = xs.takeAttributeName(); 
     throw new InvalidAttributeException(an); 
    } 
    if (xs.atStart("code")) { 
     xs.takeStart("code"); 
     String s; 
     if (xs.atChars(XMLScanner.WS_COLLAPSE)) { 
      s = xs.takeChars(XMLScanner.WS_COLLAPSE); 
     } else { 
      s = ""; 
     } 
     try { 
      _Code = String.valueOf(s); 
     } catch (Exception x) { 
      throw new ConversionException("code", x); 
     } 
     xs.takeEnd("code"); 
    } 
    if (xs.atStart("libelle")) { 
     xs.takeStart("libelle"); 
     String s; 
     if (xs.atChars(XMLScanner.WS_COLLAPSE)) { 
      s = xs.takeChars(XMLScanner.WS_COLLAPSE); 
     } else { 
      s = ""; 
     } 
     try { 
      _Libelle = String.valueOf(s); 
     } catch (Exception x) { 
      throw new ConversionException("libelle", x); 
     } 
     xs.takeEnd("libelle"); 
    } 
    _TypeApplication = ((TypeApplication) u.unmarshal()); 
    if (xs.atStart("entite")) { 
     xs.takeStart("entite"); 
     String s; 
     if (xs.atChars(XMLScanner.WS_COLLAPSE)) { 
      s = xs.takeChars(XMLScanner.WS_COLLAPSE); 
     } else { 
      s = ""; 
     } 
     try { 
      _Entite = String.valueOf(s); 
     } catch (Exception x) { 
      throw new ConversionException("entite", x); 
     } 
     xs.takeEnd("entite"); 
    } 
    { 
     List l = PredicatedLists.create(this, pred_Pl, new ArrayList()); 
     while (xs.atStart("pl")) { 
      l.add(((Pl) u.unmarshal())); // the problem is here : unmarshal() dont gives the last element -------------- 
     } 
     _Pl = PredicatedLists.createInvalidating(this, pred_Pl, l); 
    } 
    xs.takeEnd("application"); 

} 

I noticed that in (while loop) we dont get the last element Pl which we want to add to the list "l" 

Please do you have any idea? 
+0

Не используйте необработанные типы. Используйте generics: 'List ', 'ListIterator ' и 'TreeMap ' (предполагая, что 'pl.getCode()' имеет тип 'int'). – gparyani

+0

Большое вам спасибо за помощь, но в проекте используется только java 1.4, поэтому мы не можем использовать generics. Когда я его использую, я получаю эту ошибку: «Синтаксическая ошибка, параметризованные типы доступны только в том случае, если уровень источника равен 1,5». – Samounas

ответ

0

Да, на самом деле, похоже, вы не закрывать/смыва объект outputStream. Попытайтесь это, это должно помочь.

+0

Спасибо, Игорь за вашу помощь. Я уже использовал fs.flush() и fs.close() в объявлении finally, но он все равно не работает. Пожалуйста, у вас есть другая идея? – Samounas

+0

Я боюсь, что код, который вы предоставили, выглядит нормально ... Мне нужно увидеть немного больше: что такое переменная «app», что происходит внутри метода Referentiel.unmarshal? – Igor

+0

Спасибо, Игорь, я отправил ответ на ваши вопросы – Samounas