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>