SAXトランスフォーマーと<?xml ...?>の後の行末

Pavel_K

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]

編集
0

コメントを追加

0

関連記事

分類Dev

MuleでのXMLトランスフォーマーの使用

分類Dev

Android-レイアウトのパフォーマンス:プログラマティックとXML

分類Dev

Excel XML:インラインテキストのフォーマット

分類Dev

DOMからXMLへのトランスフォーマーロジック

分類Dev

カスタムフォーマットのXMLライター

分類Dev

JAXBマーシャラーと出力XMLのフォーマット

分類Dev

ブレークラインの追加とxmlコンテンツのフォーマット

分類Dev

XSLT、つまりXMLトランスフォーマーの使用時にDTDのダウンロードを防止

分類Dev

文字列の削除名前空間へのJavaのXMLトランスフォーマノード

分類Dev

XSLトランスフォーマーを使用して選択したXML要素のみを変換する方法

分類Dev

太字のテキストXMLのフォーマット

分類Dev

Xml / htmlのフォーマットと出力

分類Dev

pom.xmlは、testNG(UIパフォーマンステスト)テストとjUnit(ユニットテスト)テストをコマンドラインから別々に実行するように設定できますか?

分類Dev

ExcelからXMLへ:パフォーマンスの向上

分類Dev

XMLスキーマminOccurs / maxOccursのデフォルト値

分類Dev

SolrのカスタムフォーマットXML

分類Dev

バイナリXMLファイルの行#14:クラスフラグメントのインフレーションエラー//マップの表示

分類Dev

行末までのコンマの後のテキストを削除します

分類Dev

フォーマッターがフラグメントxmlで機能しないのはなぜですか?

分類Dev

xmlリソースファイルの文字列のフォーマット

分類Dev

XMLファイルのフォーマット:インデント

分類Dev

MuleのXMLからオブジェクトへのトランスフォーマーを使用するにはどうすればよいですか?

分類Dev

Oracle WCC NoClassDefFoundError:カスタムコンポーネントでApachePOIを実行する場合のorg / xml / sax / EntityResolver

分類Dev

XMLファイルに対するリクエストのパフォーマンス

分類Dev

既存のXMLに追加するときのXMLWriterのフォーマット

分類Dev

SimpleXMLライブラリを使用したXML-Androidでのパフォーマンス

分類Dev

空の行とコメントを保持してXMLファイルをフォーマットするCLIツール

分類Dev

デフォルトのsaxパーサーを使用しているときに巧妙に細工されたxmlによって乱用されるjaxb unmarshal?

分類Dev

SQLSのXMLを使用したOUTERAPLYのパフォーマンスの向上

Related 関連記事

  1. 1

    MuleでのXMLトランスフォーマーの使用

  2. 2

    Android-レイアウトのパフォーマンス:プログラマティックとXML

  3. 3

    Excel XML:インラインテキストのフォーマット

  4. 4

    DOMからXMLへのトランスフォーマーロジック

  5. 5

    カスタムフォーマットのXMLライター

  6. 6

    JAXBマーシャラーと出力XMLのフォーマット

  7. 7

    ブレークラインの追加とxmlコンテンツのフォーマット

  8. 8

    XSLT、つまりXMLトランスフォーマーの使用時にDTDのダウンロードを防止

  9. 9

    文字列の削除名前空間へのJavaのXMLトランスフォーマノード

  10. 10

    XSLトランスフォーマーを使用して選択したXML要素のみを変換する方法

  11. 11

    太字のテキストXMLのフォーマット

  12. 12

    Xml / htmlのフォーマットと出力

  13. 13

    pom.xmlは、testNG(UIパフォーマンステスト)テストとjUnit(ユニットテスト)テストをコマンドラインから別々に実行するように設定できますか?

  14. 14

    ExcelからXMLへ:パフォーマンスの向上

  15. 15

    XMLスキーマminOccurs / maxOccursのデフォルト値

  16. 16

    SolrのカスタムフォーマットXML

  17. 17

    バイナリXMLファイルの行#14:クラスフラグメントのインフレーションエラー//マップの表示

  18. 18

    行末までのコンマの後のテキストを削除します

  19. 19

    フォーマッターがフラグメントxmlで機能しないのはなぜですか?

  20. 20

    xmlリソースファイルの文字列のフォーマット

  21. 21

    XMLファイルのフォーマット:インデント

  22. 22

    MuleのXMLからオブジェクトへのトランスフォーマーを使用するにはどうすればよいですか?

  23. 23

    Oracle WCC NoClassDefFoundError:カスタムコンポーネントでApachePOIを実行する場合のorg / xml / sax / EntityResolver

  24. 24

    XMLファイルに対するリクエストのパフォーマンス

  25. 25

    既存のXMLに追加するときのXMLWriterのフォーマット

  26. 26

    SimpleXMLライブラリを使用したXML-Androidでのパフォーマンス

  27. 27

    空の行とコメントを保持してXMLファイルをフォーマットするCLIツール

  28. 28

    デフォルトのsaxパーサーを使用しているときに巧妙に細工されたxmlによって乱用されるjaxb unmarshal?

  29. 29

    SQLSのXMLを使用したOUTERAPLYのパフォーマンスの向上

ホットタグ

アーカイブ