Могу ли я заставить JAXB не преобразовывать «в», например, при сортировке в XML? - PullRequest
25 голосов
/ 02 октября 2009

У меня есть объект, который маршалируется в XML с использованием JAXB. Один элемент содержит строку, которая содержит кавычки ("). Полученный XML имеет ", где" существовал ".

Несмотря на то, что это обычно предпочитается, мне нужно, чтобы мой вывод соответствовал устаревшей системе. Как заставить JAXB НЕ преобразовывать сущности HTML?

-

Спасибо за ответы. Однако я никогда не вижу вызываемого обработчика escape (). Можете посмотреть и посмотреть, что я делаю не так? Спасибо!

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();
    }
}

-

Вывод такой:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<shiporder orderid="Order's ID">
    <orderperson>The woman said, &quot;How ya doin &amp; stuff?&quot;</orderperson>
</shiporder>

и, как вы можете видеть, обратный вызов никогда не отображается. (Как только я получу обратный вызов, я буду беспокоиться о том, чтобы он действительно делал то, что я хочу.)

-

Ответы [ 14 ]

0 голосов
/ 26 сентября 2018

Я бы не советовал использовать CharacterEscapeHandler по причинам, указанным выше (это внутренний класс). Вместо этого вы можете использовать Woodstox и поставить свой собственный EscapingWriterFactory на XMLStreamWriter. Что-то вроде:

XMLOutputFactory2 xmlOutputFactory = (XMLOutputFactory2)XMLOutputFactory.newFactory();
xmlOutputFactory.setProperty(XMLOutputFactory2.P_TEXT_ESCAPER, new EscapingWriterFactory() {

    @Override
    public Writer createEscapingWriterFor(Writer w, String enc) {
        return new EscapingWriter(w);
    }

    @Override
    public Writer createEscapingWriterFor(OutputStream out, String enc) throws UnsupportedEncodingException {
        return new EscapingWriter(new OutputStreamWriter(out, enc));
    }

});

marshaller.marshal(model, xmlOutputFactory.createXMLStreamWriter(out);

Пример написания EscapingWriter можно увидеть в CharacterEscapingTest .

0 голосов
/ 31 марта 2014

Почему-то не успеваю узнать, у меня сработало при настройке

marshaller.setProperty(Marshaller.JAXB_ENCODING, "utf-8");

В отличие от использования "UTF-8" или "Unicode"

Я предлагаю вам попробовать их, и, как @ Javatar сказал , проверьте их вывод в файл, используя:

marshaller.marshal(shipOrder, new File("<test_file_path>"));

и открываем его в приличном текстовом редакторе, таком как notepad ++

0 голосов
/ 04 августа 2011

Самый простой способ при использовании реализации Sun Marshaller - предоставить собственную реализацию CharacterEscapeEncoder, которая ничего не пропускает.

    Marshaller m = jcb.createMarshaller();
m.setProperty(
    "com.sun.xml.bind.marshaller.CharacterEscapeHandler",
    new NullCharacterEscapeHandler());

С

public class NullCharacterEscapeHandler implements CharacterEscapeHandler {

    public NullCharacterEscapeHandler() {
        super();
    }


    public void escape(char[] ch, int start, int length, boolean isAttVal, Writer writer) throws IOException {
        writer.write( ch, start, length );
    }
}
0 голосов
/ 07 марта 2011

интересно, но со строками вы можете попробовать

Marshaller marshaller = jaxbContext.createMarshaller();
StringWriter sw = new StringWriter();
marshaller.marshal(data, sw);
sw.toString();

по крайней мере для меня это не кавычки

...