一連の html である目印に説明を追加したいと考えています。マーシャラーを実行すると、特殊文字ではなく特殊文字列が大量に表示されます。つまり、最終的なファイルCDATA<html>
はCDATA<html>
.
JAK マーシャラーを上書きしたくないので、正確な文字列がファイルに引き継がれるようにする簡単な方法があることを願っています。
ありがとう。
"
マーシャリングは、特殊文字to "
、&
to &
、および<
toを実際にエスケープし<
ます。
私のアドバイスは、文字列の置換機能を使用することです。これは、エスケープされた文字を通常の文字に再変換するのに実際に役立ちます。
try {
StringWriter sw = new StringWriter();
return marshaller.marshal(obj, sw);
} catch (JAXBException jaxbe) {
throw new XMLMarshalException(jaxbe);
}
sw オブジェクトを使用して、sw.toString().replace() を使用して、変更された文字を元の文字に戻します。
これにより、必要なものを同期させることができます。
お役に立てれば..
CharacterEscapeHandler を実装する NoEscapeHandler を作成します (たとえば、com.sun.xml.bind.marshaller.DumbEscapeHandler を見てください)。
import java.io.IOException;
import java.io.Writer;
import com.sun.xml.bind.marshaller.CharacterEscapeHandler;
public class NoEscapeHandler implements CharacterEscapeHandler {
private NoEscapeHandler() {}
public static final CharacterEscapeHandler theInstance = new NoEscapeHandler();
public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException {
int limit = start+length;
for (int i = start; i < limit; i++) {
out.write(ch[i]);
}
}
}
次に、マーシャラーのプロパティを設定します
marshaller.setProperty("com.sun.xml.bind.characterEscapeHandler", NoEscapeHandler.theInstance);
または DataWriter を使用します
StringWriter sw = new StringWriter();
DataWriter dw = new DataWriter(sw, "utf-8", NoEscapeHandler.theInstance);
XmlStreamWriter と jaxb フラグメントを使用する場合の解決策
final XMLOutputFactory streamWriterFactory = XMLOutputFactory.newFactory(); streamWriterFactory.setProperty("escapeCharacters", false);