XMLStreamWriter writeCharacters без экранирования - PullRequest
5 голосов
/ 06 мая 2010

Как мне использовать XMLStreamWriter, чтобы написать именно то, что я вставил? Например, если я создаю тег сценария и заполняю его JavaScript, я не хочу, чтобы все мои одинарные кавычки отображались как & apos;

Вот небольшой тест, который я написал, в котором не используются никакие абстракции, которые у меня есть, только вызовы writeCharacters.

  public void testWriteCharacters() {
    StringWriter sw = new StringWriter();
    XMLOutputFactory factory = XMLOutputFactory.newInstance();

    StringBuffer out = new StringBuffer();
    try {
      XMLStreamWriter writer = factory.createXMLStreamWriter(sw);
      writer.writeStartElement("script");
      writer.writeAttribute("type","text/javascript");
      writer.writeCharacters("function hw(){ \n"+
      "\t alert('hello world');\n" +
      "}\n");
      writer.writeEndElement();
      out.append(sw);
    } catch (XMLStreamException e) {
    } finally {
      try {
        sw.close();
      } catch(IOException e) {
        e.printStackTrace();
      }
    }
    System.out.println(out.toString());
  }

Это создает сущность апос для обеих одинарных кавычек, окружающих привет мир.

Ответы [ 5 ]

8 голосов
/ 22 ноября 2012

Вы можете использовать собственность на фабрике:

final XMLOutputFactory streamWriterFactory = XMLOutputFactory.newFactory();
streamWriterFactory.setProperty("escapeCharacters", false);

Тогда создатель этой фабрики запишет символы без экранирования текста в элементе, если фабрика поддерживает это свойство. XMLOutputFactoryImpl делает.

6 голосов
/ 06 мая 2010

XmlStreamWriter.writeCharacters() не сбежит '. Это только экранирование <, > и &, а writeAttribute также экранирование " (см. javadoc ).

Однако, если вы хотите написать текст вообще без экранирования, вы должны записать его как секцию CDATA, используя writeCData().

Типичный подход для написания скриптов в CDATA разделах:

<script>//<![CDATA[
    ...
//]]></script>

То есть:

out.writeCharacters("//");
out.writeCData("\n ... \n//");
1 голос
/ 09 ноября 2017

Альтернативный метод с пользовательским обработчиком escape:

XMLOutputFactory xmlFactory = XMLOutputFactory.newInstance();
xmlFactory.setProperty(XMLOutputFactory2.P_TEXT_ESCAPER, new MyEscapingWriterFactory());

MyEscapingWriterFactory - это ваша реализация интерфейса EscapingWriterFactory . Это позволяет мелкозернистому тексту избежать контроля. Это полезно, когда вы используете текстовый элемент для обработки случайного ввода (скажем, недопустимый XML с несколькими инструкциями по обработке или неправильно написанными разделами CDATA).

0 голосов
/ 14 июля 2016

Напишите непосредственно в базовый Writer или OutputStream:

Writer out = new StringWriter();
XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(out);
... //write your XML
writer.flush();
//write extra characters directly to the underlying writer
out.write("<yourstuff>Test characters</yourstuff>");
out.flush();
... //continue with normal XML
writer.writeEndElement();
writer.flush();
0 голосов
/ 27 марта 2014

Вы также можете использовать stax-реализацию woodstox. Их XMLStreamWriter2 класс имеет метод writeRaw (). Мы используем его по этой конкретной причине, и он прекрасно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...