2012-11-05 5 views
5

JAXBモデルからXmlを出力するためにJAXB 2.2.5を使用しています。データはデータベースから読み込まれます。このようデータに表示不可能な文字が含まれていると、JAXBが無効なXMLを出力する

0x1a 

などであるとして、それはその後、JAXBはちょうどこの文字を出力することで無効なXMLを出力しない場合、それはそれか何かをエスケープするべきではないのですか?

更新

この問題を解決行う任意の実装が存在する場合、私は疑問に思う、多分EclipseLinkはMOXYはいますか?

EDIT

は、しかし私はそれが望ましくない方法で出力を変化違法char型の問題を修正し、回避策を試してみました。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><metadata created="2013-02-27T11:40:04.009Z" xmlns="http://musicbrainz.org/ns/mmd-2.0#" xmlns:ext="http://musicbrainz.org/ns/ext#-2.0"><cdstub-list count="1" offset="0"><cdstub id="w237dKURKperVfmckD5b_xo8BO8-" ext:score="100"><title>fred</title><artist></artist><track-list count="5"/></cdstub></cdstub-list></metadata> 

<?xml version="1.0" ?><metadata xmlns:ext="http://musicbrainz.org/ns/ext#-2.0" xmlns="http://musicbrainz.org/ns/mmd-2.0#" created="2013-02-27T11:39:15.394Z"><cdstub-list count="1" offset="0"><cdstub id="w237dKURKperVfmckD5b_xo8BO8-" ext:score="100"><title>fred</title><artist></artist><track-list count="5"></track-list></cdstub></cdstub-list></metadata> 

すなわち<track-list count="5"/>

に望ましくない <track-list count="5"></track-list>となっている、私はそれがこれをやっている理由はわかりません。

答えて

5

明らかに一般的な問題です.-バグJAXB generates illegal XML charactersとしてマークされています。あなたはEscape illegal characters

+0

これはうまくいきましたが残念なことに、出力が望ましくない別の方法で変更されました。質問 –

+0

への更新をご覧ください。残念ながら、リンク先の回避策には、生成されたXMLをインデントしないなど、いくつかの欠点があります。( – Kaitsu

+0

)アップデートされたリンクは(https://github.com/javaee/jaxb-v2/issues/614)https ://github.com/javaee/jaxb-v2/issues/960 –

2

で別のソリューションを回避策を見つけることができます

に無効なXML文字を削除するにはApache Commonsのラングを使用することです:

import org.apache.commons.lang3.StringEscapeUtils; 

String xml = "<root>content with some invalid characters...</root>"; 
xml = StringEscapeUtils.unescapeXml(StringEscapeUtils.escapeXml10(xml)); 

escapeXml10メソッドは文字列をエスケープし、無効な文字を削除します。 メソッドはエスケープを元に戻します。最終的な結果は同じXMLですが、無効なXML文字は削除されます。

0

文字をメッセージコンテンツ内の任意のスペースで置き換えるだけです。あなたが余分なjarファイルまたはサードパーティ製のものを使用したくない場合は、そのための方法の下に試すことができます。この例では

String msgContent = "......";// string with some illegal character 
msgContent = msgContent .replaceALL("\\P{Print}","_"); 

、でReplaceAllメソッドは、アンダースコアで印刷できない文字を置き換えます。そのため、msgContentは印刷可能な文字になり、JAXBが不正な文字から保護されます。

関連する問題