JavaにおけるXML文字列とオブジェクトの相互変換手法

XML変換ユーティリティクラスの実装

以下は、XML文字列とJavaオブジェクト間の変換を行うユーティリティクラスです。

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;

/**
 * XMLとJavaオブジェクト間の相互変換を行うユーティリティクラス
 */
public class XmlConverter {
    
    /**
     * XML文字列を指定されたクラスのオブジェクトに変換します
     *
     * @param xmlData XML形式の文字列
     * @param targetClass 変換先のクラス
     * @return 変換されたオブジェクト
     * @throws Exception 変換処理中に例外が発生した場合
     */
    public static Object parseXmlToObject(String xmlData, Class<?> targetClass) throws Exception {
        JAXBContext jaxbContext = JAXBContext.newInstance(targetClass);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        StringReader reader = new StringReader(xmlData);
        return jaxbUnmarshaller.unmarshal(reader);
    }

    /**
     * JavaオブジェクトをXML文字列に変換します
     *
     * @param dataObject 変換対象のオブジェクト
     * @return XML形式の文字列
     * @throws Exception 変換処理中に例外が発生した場合
     */
    public static String convertObjectToXmlString(Object dataObject) throws Exception {
        StringWriter stringWriter = new StringWriter();
        JAXBContext jaxbContext = JAXBContext.newInstance(dataObject.getClass());
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        jaxbMarshaller.marshal(dataObject, stringWriter);
        return stringWriter.toString();
    }
}

サンプルXMLデータ

以下は、変換処理の対象となるサンプルXMLファイルです。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<queries>
    <query>
        SELECT id, name FROM users
        WHERE status = 'active'
    </query>
    <query>
        SELECT p.id, p.name, c.category_name
        FROM products p
        JOIN categories c ON p.category_id = c.id
        WHERE p.price > 1000
    </query>
</queries>

XMLマッピング用エンティティクラス

XML構造に対応するJavaエンティティクラスを実装します。

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import java.util.List;

/**
 * XMLのqueries要素に対応するエンティティクラス
 */
@XmlRootElement(name = "queries")
@XmlType(propOrder = {"queryList"})
public class QueryEntity {
    private List<String> queryList;

    @XmlElement(name = "query")
    public List<String> getQueryList() {
        return queryList;
    }

    public void setQueryList(List<String> queryList) {
        this.queryList = queryList;
    }

    @Override
    public String toString() {
        return "QueryEntity{" +
                "queryList=" + queryList +
                '}';
    }
}

実装例とテスト

以下のコードで、XMLとオブジェクト間の相互変換をテストします。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class XmlConversionDemo {
    
    public static void main(String[] args) throws Exception {
        // リソースファイルからXMLデータを読み込み
        String xmlContent = loadResourceFile("data/QueryList.xml");
        
        // XML文字列をQueryEntityオブジェクトに変換
        QueryEntity queryEntity = (QueryEntity) XmlConverter.parseXmlToObject(xmlContent, QueryEntity.class);
        System.out.println("オブジェクト変換結果: " + queryEntity);
        
        // QueryEntityオブジェクトをXML文字列に再変換
        String resultXml = XmlConverter.convertObjectToXmlString(queryEntity);
        System.out.println("XML変換結果:\n" + resultXml);
    }
    
    /**
     * リソースファイルの内容を読み込んで文字列として返します
     *
     * @param filePath リソースファイルのパス
     * @return ファイルの内容を文字列で返す
     */
    public static String loadResourceFile(String filePath) {
        StringBuilder contentBuilder = new StringBuilder();
        try {
            InputStream inputStream = Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream(filePath);
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String line;
            while ((line = reader.readLine()) != null) {
                contentBuilder.append(line).append("\r\n");
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return contentBuilder.toString();
    }
}

実行結果

上記コードを実行すると、以下のような結果が得られます。

オブジェクト変換結果: QueryEntity{queryList=[
        SELECT id, name FROM users
        WHERE status = 'active'
    , 
        SELECT p.id, p.name, c.category_name
        FROM products p
        JOIN categories c ON p.category_id = c.id
        WHERE p.price > 1000
    ]}
XML変換結果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<queries>
    <query>
        SELECT id, name FROM users
        WHERE status = 'active'
    </query>
    <query>
        SELECT p.id, p.name, c.category_name
        FROM products p
        JOIN categories c ON p.category_id = c.id
        WHERE p.price > 1000
    </query>
</queries>

タグ: Java XML JAXB データバインディング シリアライゼーション

7月10日 03:08 投稿