Могу я вынуждать JAXB не преобразовать "в " например, при маршалинге к XML?

Я также нашел эту статью о том, как установить WSS на Vista:

http://community.bamboosolutions.com/blogs/bambooteamblog/archive/2008/05/21/how-to-install-windows-sharepoint-services-3-0-sp1-on-vista-x64-x86.aspx

я лично иду путем виртуальной машины, но если кто-либо успешно выполняется на установке Vista, сообщите нам, как это пошло.

25
задан animuson 6 September 2012 в 21:11
поделиться

4 ответа

Решение, которое нашел мой товарищ по команде :

PrintWriter printWriter = new PrintWriter(new FileWriter(xmlFile));
DataWriter dataWriter = new DataWriter(printWriter, "UTF-8", DumbEscapeHandler.theInstance);
marshaller.marshal(request, dataWriter);

Вместо передачи xmlFile в marshal () передайте DataWriter, который знает как кодировку, так и соответствующий обработчик escape, если таковой имеется.

Примечание: Поскольку DataWriter и DumbEscapeHandler находятся в com.sun.xml. internal.bind.marshaller, вы должны загрузить javac.

13
ответ дан 28 November 2019 в 21:19
поделиться

Похоже, это возможно с реализацией Sun JAXB , хотя сам я этого не делал.

1
ответ дан 28 November 2019 в 21:19
поделиться

Я немного поигрался с вашим примером и отладил код JAXB. И, похоже, это что-то особенное в используемой кодировке UTF-8. Свойство escapeHandler MarshallerImpl , похоже, установлено правильно. Однако он используется не во всех контекстах. Если я искал вызовы MarshallerImpl.createEscapeHandler () , я нашел:

public XmlOutput createWriter( OutputStream os, String encoding ) throws JAXBException {
    // UTF8XmlOutput does buffering on its own, and
    // otherwise createWriter(Writer) inserts a buffering,
    // so no point in doing a buffering here.

    if(encoding.equals("UTF-8")) {
        Encoded[] table = context.getUTF8NameTable();
        final UTF8XmlOutput out;
        if(isFormattedOutput())
            out = new IndentingUTF8XmlOutput(os,indent,table);
        else {
            if(c14nSupport)
                out = new C14nXmlOutput(os,table,context.c14nSupport);
            else
                out = new UTF8XmlOutput(os,table);
        }
        if(header!=null)
            out.setHeader(header);
        return out;
    }

    try {
        return createWriter(
            new OutputStreamWriter(os,getJavaEncoding(encoding)),
            encoding );
    } catch( UnsupportedEncodingException e ) {
        throw new MarshalException(
            Messages.UNSUPPORTED_ENCODING.format(encoding),
            e );
    }
}

Обратите внимание, что в вашей настройке верхний раздел (... equals ("UTF-8") ...) принимается во внимание. Однако этот не принимает escapeHandler . Однако, если вы установите любую другую кодировку, вызывается нижняя часть этого метода ( createWriter (OutputStream, String) ), и этот метод использует escapeHandler , так что EH играет свою роль. Итак, добавление ...

    marshaller.setProperty(Marshaller.JAXB_ENCODING, "ASCII");

вызывает ваш собственный CharacterEscapeHandler . Не совсем уверен, но я предполагаю, что это своего рода ошибка в JAXB.

4
ответ дан 28 November 2019 в 21:19
поделиться

Я проверил спецификацию XML. http://www.w3.org/TR/REC-xml/#sec-references говорит, что "хорошо сформированные документы не должны объявлять ни одну из следующих сущностей: amp, lt, gt, apos, quot. ", так что получается, что парсер XML, используемый устаревшей системой, не соответствует требованиям.

(Я знаю, что это не решит вашу проблему, но по крайней мере приятно иметь возможность сказать, какой компонент сломан).

1
ответ дан 28 November 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: