JavaでXML文字列を1行にしたりフォーマットしたり

こんにちは、さるまりんです。

前回に続いてJavaの1行ネタ(?)です。

こんなXML文字列があります。

<address>
  <zip>111-0032</zip>
  <state>東京都</state>
  <city>台東区</city>
  <address1>浅草2丁目</address1>
  <address2>雷門ビル 3階</address2>
</address>

これを1行の文字列にしたい。

↓のコードで実現できます。

String formattedXml
    = "<address>\n"
    + "  <zip>111-0032</zip>\n"
    + "  <state>東京都</state>\n"
    + "  <city>台東区</city>\n"
    + "  <address1>浅草2丁目</address1>\n"
    + "  <address2>雷門ビル 3階</address2>\n"
    + "</address>";

BufferedReader reader = new BufferedReader(new StringReader(formattedXml));
StringBuilder sb = new StringBuilder();
String line;
while ( (line = reader.readLine() ) != null)
    sb.append(line.trim());

String oneLineXml = sb.toString();

変数formattedXmlに元の文字列が設定されています。

その文字列をStringReaderを用いて1行ずつ読み、前後の空白を取り除いて文字列を作っています。最終的に変数oneLineXmlに1行になった次のXML文字列が設定されます。

<address><zip>111-0032</zip><state>東京都</state><city>台東区</city><address1>浅草2丁目</address1><address2>雷門ビル 3階</address2></address>

シンプルですね。

では、今度は戻してみます。

Transformer transformer = TransformerFactory.newInstance().newTransformer();
// 先頭のXML宣言部分を出力しない
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
// インデントを2に設定
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
StreamResult result = new StreamResult(new StringWriter());
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = db.parse(new InputSource(new StringReader(oneLineXml)));
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
formattedXml = result.getWriter().toString();

javax.xmlパッケージのクラス群、特にTransformerを使ってやっています。

元のXMLのインデントが2、XML宣言部はなかったのでそれを出力しないようにして、結果を文字列として変数formattedXmlに戻しています。

出力するとこんな感じ。

<address>
  <zip>111-0032</zip>
  <state>東京都</state>
  <city>台東区</city>
  <address1>浅草2丁目</address1>
  <address2>雷門ビル 3階</address2>
</address>

元に戻りました。

あまりやることはないかもですが、ログを出力するときに必要だったので、調べてみました。

読んでくださってありがとうございます。

それではまた!