xmlコードを作成するには、次のコードを使用します。
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamWriter;
...
XMLOutputFactory xMLOutputFactory = XMLOutputFactory.newInstance();
XMLStreamWriter writer = xMLOutputFactory.createXMLStreamWriter(stringWriter);
writer.writeStartDocument("UTF-8", "1.0");
writer.writeCharacters("\n");
//I tried also writer.writeCharacters(System.getProperty("line.separator"));
writer.writeStartElement("settings");
...
1行のxmlを複数行の通常のxml形式に変換するには、次のコードを使用します。
public String transform(final String xml) throws XMLStreamException, TransformerException {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
Writer writer = new StringWriter();
transformer.transform(new StreamSource(new StringReader(xml)), new StreamResult(writer));
return writer.toString();
}
そしてこれが結果です
<?xml version="1.0" encoding="UTF-8"?><settings>
...
</settings>
ご覧のとおり、<settings
は最初の行にあります。<settings>
次の結果を得るために2行目に移動するにはどうすればよいですか?
<?xml version="1.0" encoding="UTF-8"?>
<settings>
...
</settings>
どうやるか?
Javaに付属の組み込みXSLTプロセッサを使用していると仮定します。これはXSLT1.0プロセッサであるため、XSLT1.0仕様に目を向ける必要があります。
これは、XSLT1.0がindent = "yes"について述べていることです。
インデント属性の値がyesの場合、xml出力メソッドは、結果を適切にインデントするために、結果ツリーの空白に加えて空白を出力する場合があります(ソースドキュメントまたはスタイルシートから削除された空白に基づく可能性があります)。インデント属性の値がnoの場合、追加の空白は出力されません。デフォルト値はnoです。xml出力メソッドは、アルゴリズムを使用して追加の空白を出力する必要があります。これにより、[3.4空白の削除]で説明されているプロセスを使用して、xsl:textのみで構成される空白を保持する要素のセットを使用して、出力から空白が削除された場合の結果が保証されます。追加の空白が出力される場合と追加の空白が出力されない場合は同じになります。
それはすべてかなり複雑ですが、肝心なのは、プロセッサが必要な場所に改行を出力してもよいということですが、そうする義務はありません。
XSLTプロセッサとしてSaxonを使用している場合、この時点で改行が出力されます。
しかし、なぜこの改行があなたにとってそれほど重要なのか、あなたは言っていません。あなたはそれを「問題」として持っていないと説明しますが、なぜそれが問題なのですか?標準のXMLパーサーを使用して生成されたドキュメントを解析する場合、この時点での改行はすべて無視されます。違いが生じるケースが1つあります。つまり、生成したXMLが、より大きなドキュメントに組み込まれた外部の解析済みエンティティとして使用される場合です。しかし、その場合、改行は絶対に必要ありません(Xalanが改行を出力しないのはおそらくそのためです)。
注:XSLTを使用してXMLのDoctype間のスペースを削除するも参照してください。今回は、ユーザーがシリアル化された出力の改行について不平を言っていますが、この場合は不要です。同じドキュメントの代替シリアル化間のこのような違いに関心があり、準拠パーサーがドキュメントを処理する方法に影響を与えない場合は、(a)おそらく独自のシリアライザーを作成する必要があります。(b)多くの適合ツールが利用できるというXMLの主な利点の1つが失われ、(c)何か間違ったことをしている:おそらく不適合パーサーを使用して(またはパーサーをまったく使用せずに)生成されたものを処理するXML。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加