В моем проекте 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?
Не используйте необработанные типы. Используйте generics: 'List', 'ListIterator ' и 'TreeMap ' (предполагая, что 'pl.getCode()' имеет тип 'int'). –
gparyani
Большое вам спасибо за помощь, но в проекте используется только java 1.4, поэтому мы не можем использовать generics. Когда я его использую, я получаю эту ошибку: «Синтаксическая ошибка, параметризованные типы доступны только в том случае, если уровень источника равен 1,5». – Samounas