こんにちは、さるまりんです。
前回に続いて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>
元に戻りました。
あまりやることはないかもですが、ログを出力するときに必要だったので、調べてみました。
読んでくださってありがとうございます。
それではまた!