Как может я останавливать XmlSerializer, преобразовывающий ê к & #234; в атрибуте?

У меня есть следующий DOM

    <row>
        <link href="B&#252;ro.txt" target="_blank">
            my link
        </link>
    </row>

Когда я сериализирую его в файл с помощью Java XmlSerializer, это выходит как это:

    <row>
        <link href="B&amp;#252;ro.txt" target="_blank">
            my link
        </link>
    </row>

Там какой-либо путь состоит в том, чтобы управлять путем выход дескрипторов XmlSerializer в атрибутах? Я должен делать это по-другому какой-либо путь?

Обновление

Я должен также сказать, что использую jre 1.6. Я использовал jre 1.5 до недавнего времени, и я вполне уверен, что он был сериализирован 'правильно' (т.е. '&' не оставили),

Разъяснение

DOM создается программно. Вот пример:

        Document doc = createDocument();
        Element root = doc.createElement("root");
        doc.appendChild(root);
        root.setAttribute("test1", "&#234;");
        root.setAttribute("test2", "üöä");
        root.appendChild(doc.createTextNode("&#234;"));

        StringWriter sw = new StringWriter();

        serializeDocument(doc, sw);
        System.out.println(sw.toString());

Мое решение я действительно не хотел делать это, потому что оно включило изрядное количество изменения кода и тестирования, но я решил переместить данные атрибута в элемент CDATA. Проблема, решенная избегаемый.

7
задан paul 14 June 2010 в 06:18
поделиться

2 ответа

Как получить DOM? Может ли это иметь какое-то отношение к этому? Я попробовал ваш образец XML с помощью стандартного DocumentBuilder (просто b / c я более знаком с ним) с использованием Sun Java 6 и последней версии Xerces-J (2.9.1), которая, кстати, осуждает XmlSerializer в пользу LSSerializer или TrAX.

В любом случае, при использовании этого метода сериализованный документ больше не содержит даже ссылки на символ и преобразуется в «Büro.txt». Я использовал следующий код:

String xml = "<row>\n"
    + "        <link href=\"B&#252;ro.txt\" target=\"_blank\">\n"
    + "            my link\n" + "        </link>\n" + "    </row>";

InputStream is = new ByteArrayInputStream(xml.getBytes());
Document doc = DocumentBuilderFactory.newInstance()
    .newDocumentBuilder().parse(is);

XMLSerializer xs = new XMLSerializer();
xs.setOutputCharStream(new PrintWriter(System.err));

xs.serialize(doc);
2
ответ дан 7 December 2019 в 09:57
поделиться

Проблема в том, что вы создаете DOM со значениями атрибутов, которые уже были "экранированы" в соответствии с конвенциями XML. DOM (конечно же) не понимает, что вы это сделали, и экранирует амперсанд.

Вам следует изменить

root.setAttribute("test1", "&#234;");

на

root.setAttribute("test1", "\u00EA");

Другими словами, при создании DOM используйте строки, состоящие из обычных кодовых точек Unicode. Затем XMLSerializer должен заменить символы Unicode на символьные сущности по мере необходимости ... в зависимости от выбранной кодировки символов для выходного документа.

EDIT - Причина, по которой вы все еще видите необработанные символы, а не символьные сущности в выходном XML, заключается в том, что XMLSerializer использует кодировку по умолчанию для XML, т.е. UTF-8. Способ решения этой проблемы - использовать конструктор XMLSerializer(OutputFormat) , передавая OutputFormat, который определяет требуемую кодировку символов для XML. (Похоже, что вы используете "ASCII".) Убедитесь, что вы используете совместимую кодировку для OutputStream.

4
ответ дан 7 December 2019 в 09:57
поделиться
Другие вопросы по тегам:

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