Разве Java XMLStreamReader не может иметь значения атрибутов с более высокими плоскостями Unicode?

Давайте создадим XML-файл с двумя значениями атрибута, который содержит расширенный символ Юникода

XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();

try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(ERROR_XML), "UTF-8"))) {
XMLStreamWriter xmlStreamWriter = outputFactory.createXMLStreamWriter(writer);

xmlStreamWriter.writeStartDocument();
xmlStreamWriter.writeCharacters("\n");
xmlStreamWriter.writeStartElement("start");
xmlStreamWriter.writeAttribute("test1", "11");
xmlStreamWriter.writeAttribute("test2", "22");
xmlStreamWriter.writeEndElement();
xmlStreamWriter.writeEndDocument();
}

Сгенерированный файл выглядит так:

<?xml version="1.0" ?>
<start test1="11" test2="22"></start>

Если это читается снова и значения атрибутов проверяются

XMLInputFactory inputFactory = XMLInputFactory.newInstance();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(ERROR_XML), "UTF-8"))) {
XMLStreamReader xmlStreamReader = inputFactory.createXMLStreamReader(reader);

xmlStreamReader.nextTag();
if (XMLStreamReader.START_ELEMENT == xmlStreamReader.getEventType() &&
    "start".equals(xmlStreamReader.getLocalName())) 
{
    System.out.println(xmlStreamReader.getAttributeValue(0));
    System.out.println(xmlStreamReader.getAttributeValue(1));
}}

это напечатает

11
22

Удивительно, что второе значение атрибута содержит расширенный символ Unicode 2 раза!

Любое последующее использование расширенного символа в качестве значения атрибута увеличит этот счет. В одном случае я получил значения атрибута с 12000 одинаковыми символами вместо одного. Что здесь происходит?

1 ответ

В соответствующем классе Java API есть ошибка.

Вы можете использовать "woodstox.jar", чтобы сделать это правильно. Все, что вам нужно сделать, это изменить код, который читает файл XML, следующим образом:

  • XMLStreamReader2 вместо XMLStreamReader
  • XMLInputFactory2 вместо XMLInputFactory

Это будет работать правильно. Я проверил себя.

Вы можете найти "woodstox.jar" в http://wiki.fasterxml.com/WoodstoxDownload.

Другие вопросы по тегам