Puis-je la force de JAXB de ne pas convertir " en ", par exemple, lors de la sérialisation en XML?
J'ai un Objet qui est en train d'être réunies pour XML à l'aide de JAXB. Un élément contient une Chaîne qui comprend des guillemets ("). Le XML résultant a "
où le " existait.
Même si c'est normalement préférée, j'ai besoin de ma sortie pour correspondre à une héritage système. Comment puis-je la force de JAXB de ne PAS convertir les entités HTML?
--
Merci pour les réponses. Cependant, je ne vois jamais le gestionnaire d'escape() est appelé. Pouvez-vous jeter un oeil et voir ce que je fais mal? Merci!
package org.dc.model;
import java.io.IOException;
import java.io.Writer;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.dc.generated.Shiporder;
import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler;
public class PleaseWork {
public void prettyPlease() throws JAXBException {
Shiporder shipOrder = new Shiporder();
shipOrder.setOrderid("Order's ID");
shipOrder.setOrderperson("The woman said, \"How ya doin & stuff?\"");
JAXBContext context = JAXBContext.newInstance("org.dc.generated");
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(CharacterEscapeHandler.class.getName(),
new CharacterEscapeHandler() {
@Override
public void escape(char[] ch, int start, int length,
boolean isAttVal, Writer out) throws IOException {
out.write("Called escape for characters = " + ch.toString());
}
});
marshaller.marshal(shipOrder, System.out);
}
public static void main(String[] args) throws Exception {
new PleaseWork().prettyPlease();
}
}
--
La sortie est ceci:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<shiporder orderid="Order's ID">
<orderperson>The woman said, "How ya doin & stuff?"</orderperson>
</shiporder>
et comme vous pouvez le voir, la fonction de rappel n'est jamais affiché. (Une fois que je reçois le callback qui est appelée, je vais vous soucier de l'avoir fait faire ce que je veux.)
--
- Supprimé ma précédente réponse, puisque c'était tout à fait faux... mais c'est toujours intéressant de souligner que
"
n'est pas une entité HTML, c'est un XML échapper. - C'est en fait à la fois un XML et HTML entité. en.wikipedia.org/wiki/...
- mais dans ce contexte c'est un XML échapper. Ce n'est pas en HTML.
- Un coéquipier de la mine compris cela sans exiger d'un Fournisseur de mise en œuvre Spécifiques. Indiqué ci-dessus.
- J'ai couru dans le même problème. La version de JAXB utilisez-vous? Actuellement, je utiliser JAXB 2.2.4 et de la libération de la cite sont échappés seulement dans les attributs. Cependant j'ai quelques fichiers XML, produit par v2.1.13, qui ont le même "problème". Cependant, j'ai vérifié la source de
MinimumEscapeHandler
de 2.1.13, et il semble être OK (j'ai même vérifié 2.0.1). Peut-être, cette évasion gestionnaire n'a pas été activé (merci à @GrzegorzOledzki pour le rapport de bug). - Après débogage, il s'est avéré être un ridicule problème: Échapper à la politique pour les guillemets (") est différent lors de la sérialisation est effectuée à OutputStream ou de l'Écrivain.
Vous devez vous connecter pour publier un commentaire.
Solution de mon coéquipier trouvé:
Au lieu de passer le xmlFile de maréchal(), passer le DataWriter qui connaît à la fois l'encodage et une évasion gestionnaire, le cas échéant.
Remarque: Depuis DataWriter et DumbEscapeHandler sont à la fois au sein de la com.soleil.xml.interne.bind.marshaller package, vous devez bootstrap javac.
Je viens de faire mon gestionnaire personnalisé en classe comme ceci:
dans le marshaller méthode appelez simplement:
il fonctionne très bien.
J'ai été jouer avec votre exemple un peu et le débogage de l'JAXB code. Et il semble que c'est quelque chose de spécifique au sujet de l'encodage UTF-8 utilisé. Le escapeHandler propriété de
MarshallerImpl
semble être réglé correctement. Cependant, il est utilisé non pas dans chaque contexte. Si j'ai cherché pour les appels deMarshallerImpl.createEscapeHandler()
j'ai trouvé:Note que, dans votre programme d'installation de la section supérieure
(...equals("UTF-8")...)
est pris en considération. Mais celui-ci ne prend pas laescapeHandler
. Toutefois, si vous définissez le codage de toutes les autres, la partie inférieure de cette méthode est appelée (createWriter(OutputStream, String)
) et celui-ci utiliseescapeHandler
, alors HEIN joue son rôle.Donc, l'ajout de...
rend votre personnalisé
CharacterEscapeHandler
être appelé.Pas vraiment sûr, mais je suppose que c'est le genre de bug dans JAXB.
@Elliot vous pouvez utiliser cette commande pour activer le marshaller pour entrer characterEscape fonction.
C'est bizarre mais ça marche que si vous avezUnicode" au lieu de "UTF-8".
Ajouter juste avant ou après que vous avez défini CharacterEscapeHandler propriété.
Cependant ne pas être juste seulement par la vérification de votre console au sein de votre IDE, car il devrait être affichés dépendent de l'espace de travail d'encodage. Il est préférable de vérifier c'est aussi à partir d'un fichier comme ça:
Je dirais que la meilleure façon de le faire est par substitution de
CharacterEscapeHandler
:j'ai trouvé le même problème
j'ai fixé ce, à l'aide de xmlWriter
dans xmlWriter fichier il y a une méthode isEscapeText() et setEscapeTest
qui est par défaut à true
si vous ne voulez pas de transformation entre < < cette période, vous devez setEscapeTest(false); au cours de triage
ce changement écrivain.setEscapeText(false); fixé mon problème
espérons que cela change utile pour vous
Semble que c'est possible avec Du soleil JAXB mise en œuvre, bien que je ne l'ai pas fait moi-même.
J'ai vérifié la spécification XML. http://www.w3.org/TR/REC-xml/#sec-references dit "bien formé documents n'ont pas besoin de déclarer une des entités suivantes: amp, lt, gt, apos, quot." il semble donc que l'analyseur XML utilisé par le système existant n'est pas conforme.
(Je sais qu'elle ne résout pas votre problème, mais au moins, c'est agréable d'être en mesure de dire quel composant est défectueux).
Cela fonctionne pour moi, après la lecture d'autres posts:
intéressant, mais avec des chaînes, vous pouvez essayer
au moins pour moi ce ne pas échapper les guillemets
La façon la plus simple, lors de l'utilisation du soleil Marshaller mise en œuvre est de fournir à votre propre mise en œuvre de la CharacterEscapeEncoder qui n'échappe pas à quoi que ce soit.
Avec
Pour une raison que je n'ai pas le temps pour le savoir, il a travaillé pour moi lors de la configuration de
Par opposition à l'aide
"UTF-8"
ou"Unicode"
Je vous suggère d'essayer, et comme @Javatar dit, vérifier dumping de fichier à l'aide de:
et en l'ouvrant avec un décent éditeur de texte comme notepad++
Je vous déconseillons d'utiliser
CharacterEscapeHandler
pour les raisons mentionnées ci-dessus (c'est une classe interne). Au lieu de cela, vous pouvez utiliser Woodstox et de fournir votre propreEscapingWriterFactory
à unXMLStreamWriter
. Quelque chose comme:Un exemple de la façon d'écrire une
EscapingWriter
peut être vu dans CharacterEscapingTest.Après avoir essayé toutes les solutions ci-dessus, est finalement arrivé à la conclusion.
votre regroupement logique par le biais de la coutume échapper gestionnaire.
Et la coutume s'échapper gestionnaire est comme suit: