xmlファイルの中身を文字列に変換する

xmlファイルの中身を文字列に変換する

xmlファイルを読みこんで、文字列に変換する処理です。
用途としてはSOAP通信でxmlを渡したい時などに使えるかと思います。

hoge.xml

<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
 <hogehoge>
  <hoge>
   <name>hogepuge</name>
   <address>hogepuge</address>
  </hoge>
</hogehoge>

XmlTransfar.java

package xmlTransfar;

import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
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.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XmlTransfar {

    public static void main(String[] args) throws Exception {

        StringBuffer sb = new StringBuffer();
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        // ドキュメントの妥当性を検証しない
        factory.setValidating(false);
        // xml名前空間をサポートするように指定する
        factory.setNamespaceAware(true);

        DocumentBuilder builder = factory.newDocumentBuilder();
        // XMLファイルの指定
        Document doc = builder.parse(
                "file:C:/hoge.xml");

        Element element = doc.getDocumentElement();
        // 親ノードから読み込む
        Node node = element.getParentNode();

        sb.append(convertToString(node));

        // 読み込み結果
        System.out.println("読み込み結果");
        System.out.println(sb);

    }

    /**
     * ノードの要素値を文字列に変換します。 ノード内にタグが含まれている場合、そのタグは自動整形されます。
     * @param node 変換対象の文字列
     * @return 変換後文字列
     * @throws TransformerException XML規約に違反している場合に発生する例外
     */
    public static String convertToString(
            Node node) throws TransformerException {
        // ノードをXMLとして定義します
        DOMSource source = new DOMSource(node);
        // 文字列生成用ストリーム
        StringWriter swriter = new StringWriter();
        StreamResult result = new StreamResult(swriter);
        // XMLを文字列に変換します
        transform(source, result);
        return swriter.toString();
    }

    /**
     * XML変換エンジン呼び出しです。
     * @param source 変換対象のXML
     * @param result 変換後文字列
     * @throws TransformerException XML規約に違反している場合に発生する例外
     */
    private static void transform(Source source,
            Result result) throws TransformerException {
        // 変換エンジンを取得します
        Transformer transformer = TransformerFactory.newInstance()
                .newTransformer();
        // XML変換のルールを設定します
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        // 変換
        transformer.transform(source, result);
    }
}

結果

読み込み結果
<hogehoge>
  <hoge>
   <name>hogepuge</name>
   <address>hogepuge</address>
  </hoge>
</hogehoge>

参考になったところ
(xmlを文字列に変換するところはそのまま使わせてもらっています。

githubにソースをあげてあります。
xmlTransfar

プログラミングカテゴリの最新記事