Как остановить преобразование XmlSerializer ê в ê в атрибуте? - PullRequest
7 голосов
/ 09 июня 2010

У меня есть следующий 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.Проблема решена устранена.

Ответы [ 2 ]

4 голосов
/ 14 июня 2010

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

Вы должны изменить

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

до

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

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

РЕДАКТИРОВАТЬ - Причина, по которой вы все еще видите необработанные символы, а не символьные объекты в выходном XML, заключается в том, что XMLSerializer использует кодировку по умолчанию для XML; то есть UTF-8. Чтобы решить эту проблему, используйте конструктор XMLSerializer(OutputFormat), передав ему OutputFormat, который задает требуемую кодировку символов для XML. (Похоже, вы используете «ASCII».) Обязательно используйте совместимую кодировку символов для OutputStream.

2 голосов
/ 09 июня 2010

Как вы получаете DOM?Это как-то связано с этим?Я попробовал ваш пример XML с помощью стандартного DocumentBuilder (только потому, что я более знаком с ним), используя 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);
...