2012-05-03 16 views
2

私は古典的なDOMを使用してJavaで複数行のXML属性を解析しようとしています。解析は正常に動作しています。しかし、それは改行を破壊するので、解析された文字列をレンダリングすると、改行は単純なスペースに置き換えられます。JavaでXMLの複数行の文字列を解析する

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

私が使用している属性を取得するには:私はちょうど「\ n」を使用してレンダリングする方法を手動で入力した文字列を渡すと

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

を意図したように、テキストが描画されます。

アイデア?

+1

XML仕様のCR/LFの組み合わせは、XMLプロセッサによりLFに正規化されなければならないによると、コード – ControlAltDel

答えて

3

これまでJDomを使用してきました。これは、複数の属性をデコードする際に多くの問題を軽減し、JavaでのXML解析/書き込みを実際に強化します。JDomはAndroid開発にも対応しており、実際は非常に小さい(1つのjarファイルのみ)。

https://github.com/hunterhacker/jdom

+0

私はまず最初に(そして非常に醜い) "< br/>"の解決策を修正しましたが、私はJDomを確かめます。どうもありがとう。 –

+1

@Fsero - これをJDomでどのように管理したか簡単に説明できますか?私はちょうど小さなユニットテストを書いたし、属性の改行はXercesの土地でJDomに行く前に一掃されます。 – nullPainter

3

XML specificationによると、XMLパーサは改行文字をスペースで置き換えるなど、属性空白を正規化しなければならない(MUST)。私。改行を保存する必要がある場合は、属性値を使用することはできません。

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

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

+1

@Benを投稿してください。 – erikxiv

+0

はい、正確です。アプリケーションとの違いが重要な場合は、他の方法でエンコーディングする必要があります。独自のmakeの特別なタグが理想的な方法です。 – Ben

2

投稿者the XML specifcation: 3.3.3属性値の正規化。属性の値が妥当性をチェックアプリケーションや に渡される前に、XMLプロセッサは、以下のアルゴリズムを適用することにより、属性 値を正規化しなければならない

:あなたは、すべての白のスペースが単一のスペースにnormallisedされていることがわかりますまたはアプリケーションに渡される値がアルゴリズムによって生成された値と同じであるような他の方法 を使用して、すべての改行は、2.11の行末処理で説明したように、#xAへの入力時に を正規化しなければならないため、このアルゴリズムの残りの部分は、この方法で正規化されたテキストに対して動作します。

空の文字列で構成される正規化された値から始めます。最初と最後に を継続始まる

正規化されていない属性値の各文字、実体参照、または文字参照のために

、次の手順を実行します。

文字参照については、を基準に文字を追加 正規化された値。

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

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

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