2012-11-05 9 views
5

Używam JAXB 2.2.5 do wyprowadzania Xml z Modelu JAXB, dane są zapełniane z bazy danych i czasami baza danych zawiera znaki niemożliwe do wyświetlenia, które nie powinny takich jakJAXB wyprowadza niepoprawny XML, gdy dane zawierają znaki niemożliwe do wyświetlenia

0x1a 

Jeśli tak wtedy JAXB wyjść nieprawidłowy XML poprzez wyprowadzanie tylko ten char jak jest, nie powinien on uciec albo coś?

Aktualizacja

Zastanawiam się, czy istnieją implementacje, które rozwiążą ten problem, może EclipseLink Moxy robi?

EDIT

Próbowałem obejścia, która rozwiązuje problem nielegalnego char jednak zmienia wyjście w niepożądany sposób.

<?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> 

do

<?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> 

tj <track-list count="5"/> stała <track-list count="5"></track-list> co jest niepożądane, nie jestem pewien, dlaczego to robi.

Odpowiedz

5

Najwyraźniej jest to powszechny problem - i oznaczony jako błąd JAXB generates illegal XML characters.

można znaleźć obejście na Escape illegal characters

+0

to działa, ale niestety zmieniło wyjście w inny sposób, którego nie chcę, zobacz aktualizację do pytania –

+0

Dzięki za odpowiedź. Niestety, obejście, które łączysz, ma pewne braki, takie jak brak wcięcia wygenerowanego XML :( – Kaitsu

+0

Zaktualizowany link (jak sądzę) to https://github.com/javaee/jaxb-v2/issues/614 - również powiązany wydaje się https : //github.com/javaee/jaxb-v2/issues/960 –

2

Innym rozwiązaniem jest użycie Apache Commons Lang usunąć nieprawidłowe znaki XML:

import org.apache.commons.lang3.StringEscapeUtils; 

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

Sposób escapeXml10 ujdzie String i usuń nieprawidłowe znaki. Metoda spowoduje cofnięcie zmiany znaczenia. Końcowym wynikiem jest ten sam plik XML, ale z usuniętymi niepoprawnymi znakami XML.

0

Po prostu zamień znak na dowolny lub spację w treści wiadomości. Jeśli nie chcesz korzystać z dodatkowych rzeczy słoik lub osób trzecich, można spróbować poniżej metody do niego:

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

W tym przykładzie metoda replaceALL zastąpić niedrukowalnych znaków podkreślenia. Tak więc twój msgContent będzie tylko drukowanymi znakami, które uniemożliwią JAXB nielegalne znaki.