0

私がしたいこと

いくつかの異なる Java オブジェクトを XML にエクスポートしたいと考えています。コードの重複を最小限に抑えるために、次のアプローチを採用しました。

標準の空の DOM ドキュメントとトランスフォーマー ファクトリ パーツの作成を実装する抽象クラスを作成しました。

次に、DOM ドキュメントを特定のオブジェクト データで埋めるための抽象メソッドを追加しました。次に、抽象クラスを拡張し、その特定のオブジェクトの抽象メソッドを実装する CustomerExporter クラスを作成しました。

私はそれを働かせました。

私の質問

さまざまな Java オブジェクトに対応できるように抽象メソッドを作成するにはどうすればよいですか?

問題

オブジェクトは異なるタイプであるため、属性は常に同じではありません。したがって、インターフェイスは機能しません (または機能しますか?)。

コード

顧客クラス

package org.flexdataexoporter.dao;

public class Customer{

    private int customerID;
    private String firstname;
    private String lastname;
    private int telnumber;

    public Customer(int customerID, String firstname, String lastname, int telnumber){

        this.customerID = customerID;
        this.firstname = firstname;
        this.lastname = lastname;
        this.telnumber = telnumber;
    }

    public int getCustomerID(){
        return customerID;
    }

    public String getFirstName(){
        return firstname;
    }

    public String getLastName(){
        return lastname;
    }

    public int getTelNumber(){
        return telnumber;
    }

    public void setCustomerID(int customerID) {
        this.customerID = customerID;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public void setTelnumber(int telnumber) {
        this.telnumber = telnumber;
    }
}

顧客クラス

package org.flexdataexoporter.dao;

import java.util.ArrayList;

public class Customers extends ArrayList<Customer>  {

    private static final long serialVersionUID = 1L;

    public Customers(){ };

}

抽象エクスポーター クラス

package org.flexdataexporter.export;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.flexdataexoporter.dao.Customers;
import org.w3c.dom.Document;

public abstract class XMLExporter {

    public void generateXML(Customers customers) throws ParserConfigurationException, TransformerException{
        Document doc = createDomDoc();
        fillXML(doc, customers);
    }

    protected Document createDomDoc() throws ParserConfigurationException{
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.newDocument();
        return doc;
    }

    public abstract void fillXML(Document doc, Customers customers) throws TransformerException;


    protected void writeDoc(Document doc) throws TransformerException{

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(System.out);
        transformer.transform(source, result);
    }

}

特定の輸出クラス

package org.flexdataexporter.export;

import javax.xml.transform.TransformerException;

import org.flexdataexoporter.dao.Customer;
import org.flexdataexoporter.dao.Customers;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class CustomerExporter extends XMLExporter {

    public CustomerExporter(){ }

    @Override
    public void fillXML(Document doc, Customers customers) throws TransformerException {
        Element rootElement = doc.createElement("customers");
        doc.appendChild(rootElement);

        for(Customer c  : customers){
            Element customer = doc.createElement("customer");
            rootElement.appendChild(customer);
            customer.setAttribute("id", Integer.toString(c.getCustomerID()));

            Element name = doc.createElement("firstname");
            name.appendChild(doc.createTextNode(c.getFirstName()));
            customer.appendChild(name);

            Element lastname = doc.createElement("lastname");
            lastname.appendChild(doc.createTextNode(c.getLastName()));
            customer.appendChild(lastname);

            Element phone = doc.createElement("phone");
            phone.appendChild(doc.createTextNode(Integer.toString(c.getTelNumber())));
            customer.appendChild(phone);
            super.writeDoc(doc);
        }
    }
}

誰かが解決策を手伝ってくれることを願っています。

4

2 に答える 2

0

これを行うライブラリを探すことをお勧めします。しかし、自分で書く必要があると仮定すると、必要なのはジェネリックだと思います

public abstract class XMLExporter<T> {
    public void generateXML(T object) throws ParserConfigurationException, TransformerException{
        Document doc = createDomDoc();
        fillXML(doc, object);
    }

    public abstract void fillXML(Document doc, T object) throws TransformerException;
}

そして、実装クラス

public class CustomerExporter extends XMLExporter<Customers> {

}

Java をしばらく使用していないので、構文が間違っているか不完全である可能性がありますが、うまくいけば、これが目的の場所に移動することを願っています。

于 2013-02-07T16:02:14.850 に答える
0

別のアプローチをお勧めします。

  1. XSD を指定する
  2. xjc を使用して (Maven プラグインまたは Ant タスクなどを介して) JAXB クラスを生成します。
  3. JAXB を使用して XML ドキュメントをマーシャリングする
于 2013-02-07T15:51:19.777 に答える