среда, 2 мая 2012 г.

JAXB2

Java Architecture for XML Binding -- набор инструментов для ява, которые помогают, парсить дефиниции схем, генерить соответсвующие ява-классы, которые можно использовать для построения документов соотвествующих этой схеме и подальшей их гененерации в хмл.

JAXB2 -- это следующая версия, которая помогает все делать еще проще.

JAXB2 идет в связке с инструментарием для работы с вебсервисами JWSDP2.0(Java Web Services Developers Pack 2.0)


Вот пример схемы schema.xsd:

<xsd:schema
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <xsd:element name="catalog" type="catalogType"/>
 <xsd:complexType name="catalogType">
  <xsd:sequence>
   <xsd:element ref="journal"  minOccurs="0"
    maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="section" type="xsd:string"/>
  <xsd:attribute name="publisher" type="xsd:string"/>
 </xsd:complexType>
 <xsd:element name="journal" type="journalType"/>
 <xsd:complexType name="journalType">
  <xsd:sequence>
   <xsd:element ref="article"  minOccurs="0"
    maxOccurs="unbounded"/>
  </xsd:sequence>
 </xsd:complexType>
 <xsd:element name="article" type="articleType"/>
 <xsd:complexType name="articleType">
  <xsd:sequence>
   <xsd:element name="title" type="xsd:string"/>
   <xsd:element name="author" type="xsd:string"/>
  </xsd:sequence>
  <xsd:attribute name="level" type="xsd:string"/>
  <xsd:attribute name="date" type="xsd:string"/>
 </xsd:complexType>
</xsd:schema>


Дальше нужно использовать тулзовину, которая является XJC (XML Java Compiller):
/path/to/jaxb/bin/xjc.sh -p my.package schema.xsd
После чего мы получим пакет my.package с классами:

  • ArticleType.java
  • CatalogType.java
  • JournalType.java
  • ObjectFactory.java
Первые три класса соответствуют трем комплексным типам, определенным в схеме дифиниции. Последний это фабрика, с помощью которой можно создавать инстанции этих классов. В XJC есть проблема, тулзовина не всегда ставит аннотацию @XMLRootElement соответсвующему элементу, поэтому иногда приходится это делать руками. А вот пример кода, как сгенерить документ соответсвующий этой схеме:
JAXBContext jaxbContext=JAXBContext.
                 newInstance("my.package");
Marshaller marshaller=jaxbContext.
    createMarshaller();
ObjectFactory factory=new ObjectFactory();
CatalogType catalog=(CatalogType)
 (factory.createCatalogType());
catalog.setSection("my catalog");
catalog.setPublisher("my publisher");

ArticleType articleType =
   factory.createArticleType();
articleType.setAuthor("an author");
articleType.setTitle("a nice article");
articleType.setLevel("rant");

JournalType journal =
  factory.createJournalType();
journal.getArticle().add(articleType);

catalog.getJournal().add(journal);
File file = new File("c:/jaxb2example.xml");
marshaller.
 setProperty("jaxb.formatted.output", true);
marshaller.marshal(catalog,
  new FileOutputStream(file));

Unmarshaller unmarshaller =
  jaxbContext.createUnmarshaller();
CatalogType c = (CatalogType)
 unmarshaller.unmarshal(file);

System.out.println("author is = " +
  c.getJournal().get(0).getArticle().
  get(0).getAuthor());
А вот хмл файл который получится в итоге:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<catalogType section="my catalog"
   publisher="my publisher">
  <journal>
    <article level="rant">
      <title>a nice article</title>
      <author>an author</author>
    </article>
  </journal>
</catalogType>
Для процесса компиляции и рантайма необходимо в класспазе иметь следующие джарники:
jwsdp-2.0/jaxb/lib/jaxb-api.jar
jwsdp-2.0/jaxb/lib/jaxb-impl.jar
jwsdp-2.0/jaxb/lib/jaxb-xjc.jar

Комментариев нет:

Отправить комментарий