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


Автор: Kizja 11.5.2010, 21:04
Привет, подскажите пожалуйста можно ли с помощью apache digister из ява объекта сгенерировать xml? Искал примеры, но нашёл только в обратную сторону, т.е. из xml в ява объект, а обратно ни одного примера не нашёл... Может у кого-нибудь есть пример как это можно сделать ?

Пример из xml в ява:

Код

import java.io.File;

import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;

public class XmlRulesDriver {
    public static void main(String[] args) {
        try {
            File input = new File("catalog.xml");
            File rules = new File("rules.xml");

            Digester digester = DigesterLoader.createDigester(rules.toURI()
                    .toURL());

            Catalog catalog = (Catalog) digester.parse(input);
            System.out.println(catalog.toString());
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    }
}


Код

public class Article {
    private String headline;
    private String page;

    public Article() {
    }

    public void setHeadline(String rhs) {
        headline = rhs;
    }

    public void setPage(String rhs) {
        page = rhs;
    }

    public String toString() {
        return "Article: Headline='" + headline + "' on page='" + page + "' ";
    }
}


Код

public class Book {
    private String author;
    private String title;

    public Book() {
    }

    public void setAuthor(String rhs) {
        author = rhs;
    }

    public void setTitle(String rhs) {
        title = rhs;
    }

    public String toString() {
        return "Book: Author='" + author + "' Title='" + title + "'";
    }
}


Код

import java.util.ArrayList;
import java.util.List;

public class Catalog {
    private List<Book> books;
    private List<Magazine> magazines;

    public Catalog() {
        books = new ArrayList<Book>();
        magazines = new ArrayList<Magazine>();
    }

    public void addBook(Book rhs) {
        books.add(rhs);
    }

    public void addMagazine(Magazine rhs) {
        magazines.add(rhs);
    }

    public String toString() {
        String newline = System.getProperty("line.separator");
        StringBuffer buf = new StringBuffer();

        buf.append("--- Books ---").append(newline);
        for (int i = 0; i < books.size(); i++) {
            buf.append(books.get(i)).append(newline);
        }

        buf.append("--- Magazines ---").append(newline);
        for (int i = 0; i < magazines.size(); i++) {
            buf.append(magazines.get(i)).append(newline);
        }

        return buf.toString();
    }
}


Код

import java.util.ArrayList;
import java.util.List;

public class Magazine {
    private String name;
    private List<Article> articles;

    public Magazine() {
        articles = new ArrayList<Article>();
    }

    public void setName(String rhs) {
        name = rhs;
    }

    public void addArticle(Article a) {
        articles.add(a);
    }

    public String toString() {
        StringBuffer buf = new StringBuffer("Magazine: Name='" + name + "' ");
        for (int i = 0; i < articles.size(); i++) {
            buf.append(articles.get(i).toString());
        }
        return buf.toString();
    }
}



rules.xml:

Код

<?xml version="1.0"?>

<digester-rules>
    <object-create-rule pattern="catalog" classname="Catalog" />
    <set-properties-rule pattern="catalog">
        <alias attr-name="library" prop-name="library" />
    </set-properties-rule>

    <pattern value="catalog/book">
        <object-create-rule classname="Book" />
        <call-method-rule pattern="author" methodname="setAuthor"
            paramcount="0" />
        <call-method-rule pattern="title" methodname="setTitle"
            paramcount="0" />
        <set-next-rule methodname="addBook" />
    </pattern>

    <pattern value="catalog/magazine">
        <object-create-rule classname="Magazine" />

        <call-method-rule pattern="name" methodname="setName"
            paramcount="0" />

        <pattern value="article">
            <object-create-rule classname="Article" />
            <set-properties-rule>
                <alias attr-name="page" prop-name="page" />
            </set-properties-rule>
            <call-method-rule pattern="headline" methodname="setHeadline"
                paramcount="0" />
            <set-next-rule methodname="addArticle" />
        </pattern>

        <set-next-rule methodname="addMagazine" />
    </pattern>
</digester-rules>


catalog.xml:

Код

<?xml version="1.0"?>

<catalog library="somewhere">

    <book>
        <author>Author 1</author>
        <title>Title 1</title>
    </book>

    <book>
        <author>Author 2</author>
        <title>His One Book</title>
    </book>

    <magazine>
        <name>Mag Title 1</name>

        <article page="5">
            <headline>Some Headline</headline>
        </article>

        <article page="9">
            <headline>Another Headline</headline>
        </article>
    </magazine>

    <book>
        <author>Author 2</author>
        <title>His Other Book</title>
    </book>

    <magazine>
        <name>Mag Title 2</name>

        <article page="17">
            <headline>Second Headline</headline>
        </article>
    </magazine>

</catalog>


Как сделать в обратную сторону ?

Может кто-то может показать как, скажем, изменить XmlRulesDriver.java класс, чтобы после строчки:

Код

Catalog catalog = (Catalog) digester.parse(input);


шёл бы не вывод в консоль, а создание и сохранение в файл catalog2.xml ?

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