У меня есть следующий DOM
<row>
<link href="Büro.txt" target="_blank">
my link
</link>
</row>
Когда я сериализирую его в файл с помощью Java XmlSerializer, это выходит как это:
<row>
<link href="B&#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", "ê");
root.setAttribute("test2", "üöä");
root.appendChild(doc.createTextNode("ê"));
StringWriter sw = new StringWriter();
serializeDocument(doc, sw);
System.out.println(sw.toString());
Мое решение я действительно не хотел делать это, потому что оно включило изрядное количество изменения кода и тестирования, но я решил переместить данные атрибута в элемент CDATA. Проблема, решенная избегаемый.
Как получить 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ü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);
Проблема в том, что вы создаете DOM со значениями атрибутов, которые уже были "экранированы" в соответствии с конвенциями XML. DOM (конечно же) не понимает, что вы это сделали, и экранирует амперсанд.
Вам следует изменить
root.setAttribute("test1", "ê");
на
root.setAttribute("test1", "\u00EA");
Другими словами, при создании DOM используйте строки, состоящие из обычных кодовых точек Unicode. Затем XMLSerializer должен заменить символы Unicode на символьные сущности по мере необходимости ... в зависимости от выбранной кодировки символов для выходного документа.
EDIT - Причина, по которой вы все еще видите необработанные символы, а не символьные сущности в выходном XML, заключается в том, что XMLSerializer использует кодировку по умолчанию для XML, т.е. UTF-8. Способ решения этой проблемы - использовать конструктор XMLSerializer(OutputFormat)
, передавая OutputFormat
, который определяет требуемую кодировку символов для XML. (Похоже, что вы используете "ASCII".) Убедитесь, что вы используете совместимую кодировку для OutputStream
.