Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Java & XML


Автор: Larrr 2.7.2006, 19:50
Проблема такова - на вход поступает XML-файл, который сконфигурирован примерно следующим образом:
Код
<object class="Adress">
   <name>adress-book</name>
   <property>
        <name>street</name>
        <value>Bla</value>
   </property>
</object>

это значит что мне в моей программе должен создаться instance класса Adress, назвать ее adress-book и наставить параметр street в значение Bla(потом этот объект сразу же помещается в Hash map). Причем очень желательно, что программер заранее не знал какие классы и их свойства будут реализованы в будущем и добавлены в namespace(пардон, не знаю как это называется в Java), но программа работала все равно без исправления кода(то есть вариант перебора всех вариантов с помощью if-then-else отпадает).

Вопрос - как это делается? Уже нашла Digester - но это, похоже, немного не то, что мне надо(требует доконфигурации парсера как минимум для каждого нового класса который появляется), хотя я могу и ошибаться.   

Автор: powerOn 2.7.2006, 21:12
Я могу ошибаться, но думаю, что эта информация будет Вам полезна. Возможно, это даже то, что необходимо:

http://www.onjava.com/pub/a/onjava/2004/12/15/jaxb.html
https://jaxb.dev.java.net/

 

Автор: LSD 3.7.2006, 00:08
Рекомендую посмотреть http://forum.vingrad.ru/index.php?showtopic=85586 и http://forum.vingrad.ru/index.php?showtopic=91542 темы.

По своему опыты могу сказать: JAXB очень приятная и удобная штука. Но из-за некоторых его ограничений, пришлось искать ему замену, и попробовали XML Beans, по моим ощущениям вещь не менее удобная, и вроде даже пошустрее чуток чем JAXB.

Цитата(Larrr @  2.7.2006,  20:50 Найти цитируемый пост)
Вопрос - как это делается? Уже нашла Digester - но это, похоже, немного не то, что мне надо(требует доконфигурации парсера как минимум для каждого нового класса который появляется), хотя я могу и ошибаться.

Digester - это действительно немного другое. Он более гибкий чем JAXB и подобные решения, но при этом гораздо более медленный. Он больше предназначен для конфигурационных файлов, чем для парсинга XML. С его помощью например парсятся файлы - Log4j, ANT и т.п.

JAXB-о подобные решения будут требовать наличия XML Schem-ы для документов. Что естественно исключает возможность добавления произвольных тегов в документ (вернее эта возможность должна быть заранее оговорена). 

Автор: Larrr 3.7.2006, 12:08
Спасибо большое за совет! Я прочитала про JAXB небольшой тюториал с ibm developer works и мне показалось, что JAXB создает свои интерфейсы и потом из них делает объекты, а мне надо чтобы ничего не создавалось, а вызывался уже существующий класс. Подойдет ли для этого JAXB или стоит поискать что-нибудь другое? 

PS. http://www.velocityreviews.com/forums/t135493-jaxb-mapping-xml-to-existing-java-objects.html вроде бы пишут что JAXB для моих целей не подходит  smile . Но там же упоминается http://www.castor.org/xml-framework.html - который как раз работает с уже существующими объектами, но там имеются свои проблемы(вроде того, что инстанс класса должен быть уже создан).
В общем, пока вопрос остается открытым  smile . 

Автор: LSD 3.7.2006, 22:10
Так, еще раз. Что известно про XML и объекты.

XML - четко задан, или может произвольно меняться? И если да то насколько сильно? И как надо реагировать на изменения в XML не предусмотренные изначально?

Объекты заданы извне, или могут создаваться/модифицироваться по мере необходимости? 

Автор: Larrr 5.7.2006, 11:31
Задан формат XML - примерно как я написала, то есть перечень объектов и свойств, которые им нужно проставить. Вполне можно использовать для валидации и схему тк формат XML заранее известен.
Что касается объектов, то указанные в файле классы уже существуют - надо их просто инстанцировать(причем объекты еще не созданы, так как заранее неизвестно сколько и каких именно объектов придется создавать). 

Автор: last 5.7.2006, 12:22
Быть может Вам простой способ подойдет: http://java.sun.com/j2se/1.5.0/docs/api/java/beans/XMLDecoder.html

Суть XMLDecoder --- простая сериализация, как с ObjectOutputStream. Только вместо бинарного формата --- XML.

Код

       XMLDecoder d = new XMLDecoder(
                          new BufferedInputStream(
                              new FileInputStream("Test.xml")));
       Object result = d.readObject();
       d.close();


Только объект должен быть bean и XML к нужному виду привести надо 

Автор: Larrr 5.7.2006, 12:33
Спасибо большое за советы!  smile Вопрос решился с помощью Spring framework & XmlBeanFactory. Как именно это делать можно понять из примеров http://www.java2s.com/Code/Java/Spring/ShutdownHookBeanExample.htm и http://www.ddj.com/dept/debug/185300375, например. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)