2

従来の DOM を使用して、Java で複数行の XML 属性を解析しようとしています。解析はうまく機能しています。ただし、改行を破壊しているため、解析された文字列をレンダリングすると、改行が単純なスペースに置き換えられます。

<string key="help_text" value="This is a multi line long
                               text. This should be parsed
                               and rendered in multiple lines" />

私が使用している属性を取得するには:

attributes.getNamedItem("value").getTextContent()

"\n" を使用して手動で入力した文字列を render メソッドに渡すだけで、テキストは意図したとおりに描画されます。

何か案は?

4

3 に答える 3

3

XML仕様によれば、XMLパーサーは、改行文字をスペースに置き換えるなど、属性の空白を正規化する必要があります。つまり、改行を保持する必要がある場合は、属性値を使用できません。

一般に、XMLでの空白の処理は多くの問題です。特に、CR、LF、およびCRLFの違いはどこにも保存されません。

属性の改行を&lt;br /&gt;(つまり、のエンコードされたバージョン<br />)としてエンコードし、後でデコードする方がよい場合があります。

于 2012-05-03T21:13:25.387 に答える
3

過去にこれにJDomを使用しました。複数行の属性をデコードする際のトラブルを大幅に軽減し、Java での XML の解析/書き込みを大幅に強化します。JDom は Android 開発とも互換性があり、非常に小さい (1 つの jar ファイルのみ)。

https://github.com/hunterhacker/jdom

于 2012-05-03T21:26:49.827 に答える
2

XML 仕様から: 3.3.3 属性値の正規化。すべての空白が単一のスペースに正規化されていることがわかります。

属性の値をアプリケーションに渡すか有効性をチェックする前に、XML プロセッサは、以下のアルゴリズムを適用するか、アプリケーションに渡される値が生成された値と同じになるように他の方法を使用して、属性値を正規化する必要があります。アルゴリズムによって。2.11 行末処理で説明されているように、すべての改行は #xA への入力で正規化されている必要があるため、このアルゴリズムの残りの部分は、この方法で正規化されたテキストで動作します。

空の文字列で構成される正規化された値から始めます。

正規化されていない属性値の各文字、エンティティ参照、または文字参照について、最初から最後まで、次の手順を実行します。

文字参照の場合、参照された文字を正規化された値に追加します。

エンティティ参照の場合、このアルゴリズムのステップ 3 をエンティティの置換テキストに再帰的に適用します。

空白文字 (#x20、#xD、#xA、#x9) の場合、正規化された値に空白文字 (#x20) を追加します。

別の文字の場合は、その文字を正規化された値に追加します。

于 2012-05-03T21:15:45.223 に答える