Java API を使用して xml 文字列をきれいに印刷できるようにする必要があり、Web とこの特定の Web サイトの両方で、これに対する複数のソリューションを見つけました。ただし、これを javax.xml.transform.Transformer で動作させるための複数の試みにもかかわらず、これまでのところ失敗しています。以下に示すコードは、引数の xml 文字列に xml 要素間に改行が含まれていない場合に部分的にしか機能しません。これではダメです。以前にきれいに印刷された文字列であっても、整形式で有効なxmlであると仮定して、何でもきれいに印刷できる必要があります。
私はこれを手に入れました(私が見つけたコードスニペットからまとめて、人々はそれが彼らのために働いたと主張しました):
import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
public class XMLFormatter {
public static String format(String xml, int indent, boolean omitXmlDeclaration)
throws TransformerException {
if (indent < 0) {
throw new IllegalArgumentException();
}
String ret = null;
StringReader reader = new StringReader(xml);
StringWriter writer = new StringWriter();
try {
TransformerFactory factory = TransformerFactory.newInstance();
factory.setAttribute("indent-number", new Integer(indent));
Transformer transformer = factory.newTransformer();
if (omitXmlDeclaration) {
transformer.setOutputProperty(
OutputKeys.OMIT_XML_DECLARATION, "yes");
}
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(
"{http://xml.apache.org/xslt}indent-amount",
String.valueOf(indent));
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.transform(
new StreamSource(reader),
new StreamResult(writer));
ret = writer.toString();
} catch (TransformerException ex) {
throw ex;
} finally {
if (reader != null) {
reader.close();
}
try {
if (writer != null) {
writer.close();
}
} catch (IOException ex) {}
}
return ret;
}
public static void main(String[] args) throws TransformerException {
StringBuilder sb = new StringBuilder();
sb.append("<rpc-reply><data><smth/></data></rpc-reply>");
System.out.println(sb.toString());
System.out.println();
System.out.println(XMLFormatter.format(sb.toString(), 4, false));
final String NEWLINE = System.getProperty("line.separator");
sb.setLength(0);
sb.append("<rpc-reply>");sb.append(NEWLINE);
sb.append("<data>");sb.append(NEWLINE);
sb.append("<smth/>");sb.append(NEWLINE);
sb.append("</data>");sb.append(NEWLINE);
sb.append("</rpc-reply>");
System.out.println(sb.toString());
System.out.println();
System.out.println(XMLFormatter.format(sb.toString(), 4, false));
}
}
このコードは、これらの改行に悩まされるべきではありませんか? これはバグですか、それともここで重要な何かが欠けていますか? コード スニペットの出力:
<rpc-reply><data><smth/></data></rpc-reply>
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply>
<data>
<smth/>
</data>
</rpc-reply>
<rpc-reply>
<data>
<smth/>
</data>
</rpc-reply>
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply>
<data>
<smth/>
</data>
</rpc-reply>
私が知る限り、私のコードが他の例と異なるのは、transform(in, out) メソッドに StringWriter と StringReader を使用している点だけです。私はすでにxmlをByteArrayOutputStreamに変換し、それをDOMで解析してからトランスフォーマーに供給しようとしましたが、結果は同じです。これが単一行の文字列でのみ機能する理由を知りたいです。
jdk1.6_u24 を Netbeans 6.9.1 と組み合わせて使用しています。
この質問は(おそらく他の多くの人にも)関連していますが、次のものと同じではありません: