Отступ StringTemplate добавляет пробел внутри String

Это, очевидно, SSCCE.

У меня есть следующий файл шаблона:

xml(value)::=<<
<a>
    <b>
        ^value^
    </b>
</a>
>>

... со следующим кодом:

private static final String VALUE="alpha\nbeta";
public static void main(String args[]) throws Exception {
    STGroup stGroup = new STGroupFile("templates/a.xml.stg", '^', '^');
    ST st = stGroup.getInstanceOf("xml");
    st.add("value", VALUE);
    System.out.printf("--------\n%s\n--------", st.render());
}

Код производит:

 [java] --------
 [java] <a>
 [java]     <b>
 [java]         alpha
 [java]         beta
 [java]     </b>
 [java] </a>
 [java] --------

Другими словами, значение String изменяется при добавлении пробела. Когда клиент анализирует XML-файл, даже с усечением пробела, значение String будет восприниматься как измененное, поскольку пробел был добавлен внутри String.

Я понимаю, что решение состоит в том, чтобы объявить шаблон как:

xml(value)::=<<
<a>
    <b>^value^</b>
</a>
>>

... но даже это решение требует, чтобы все другие узлы, которые могут содержать xml рендеринг также оправдан.

Например, предполагая, что приведенное выше значение встроено в другой шаблон, затем следующий шаблон:

enclosing-document(xml)::=<<
<h1>
    <h2>
        ^xml^
    </h2>
</h1>
>>

... также должен быть переписан как:

enclosing-document(xml)::=<<
<h1>
    <h2>
^xml^
    </h2>
</h1>
>>

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

Есть ли способ проинструктировать StringTemplate просто выдавать конкретный параметр String как есть (без отступа в случае появления новых строк внутри), в то же время сохраняя пробел / отступ для всех остальных случаев (так, чтобы мой визуализированный вывод не был быть некрасивым)?

Обновить

Я пытался использовать NoIndentWriter, но столкнулся с другими проблемами. Похоже, что NoIndentWriter действительно выдает многострочную строку как есть, но не учитывает пробелы, присутствующие в файле шаблона. Так что я вернулся на круги своя.

1 ответ

Итак, в итоге я использовал NoIndentWriter с кодом, приведенным в этом посте. Затем, чтобы решить проблему отсутствия отступов, приводящих к уродливому XML (о чем жаловалось в вышеупомянутом посте), я использовал описанный здесь симпатичный принтер XML.

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