PDA

Просмотр полной версии : Перенос строки в xml


Godwarlock
06.04.2018, 22:45
Всем привет. Подскажите, как правильно вставить в строку xml тег переноса строки. Пробовал такой вариант
<txt_test>Какой-то там текст\nТекст с другой строки</txt_test>
Но выводит сплошным "Какой-то там текст\nТекст с другой строки" без переноса с тегом \n

СлаваRa
07.04.2018, 00:16
"Но выводит" кто?

caseyryan
07.04.2018, 10:46
Ты наверное через trace() пробовал вывести?
Выведи в текстовое поле

Godwarlock
07.04.2018, 11:33
caseyryan Вывод в текстовое поле. Игнорируется тег \n.

txt_out.text = Lang.getText(step.text);

public static function getText(text:String):String
{
var result:String = ui[text]//ui = XMLList;
return result;
}

Добавлено через 16 минут
UPD: Текстфилд старлинговский 2.2

caseyryan
07.04.2018, 12:47
ты покажи весь код, а не эти куски. Не понятно что у тебя там вообще происходит

что такое step?
передай туда текст не их xml а просто строку с переносом, и посмотри перенест или нет

Godwarlock
07.04.2018, 12:58
caseyryan
передай туда текст не их xml а просто строку с переносом, и посмотри перенест или нет
Просто текст переносит, из xml, не переносит.
что такое step?
step это класс, в этом классе параметр text:String, который содержит указатель в xml txt_test
<txt_test>Какой-то там текст\nТекст с другой строки</txt_test>
Lang.getText(step.text);
Возвращает содержание указателя txt_test в String, то есть
Какой-то там текст\nТекст с другой строки
Но в текстовом поле напрямую так и выводит Какой-то там текст\nТекст с другой строки. И в трейсе точно также выводит без переноса. Не могу понять.
Что сделать так
var str:String = "Какой-то там текст\nТекст с другой строки";
trace(str);
Тип string, всё нормально переносит, как положено.
Получаю строку из xml
var result:String = ui.txt_test//ui = XMLList;
trace(result);
Тот же тип, тот же текст. Трейс выводит без переноса, сплошными текстом.
При всём при этом, даже html тэги нормально обрабатываются.
То есть если в xml вставить <txt_test>&lt;font color="#25f56a"&gt;Какой-то там текст\nТекст с другой строки&lt;/font&gt;</txt_test>
То выведет красным цветом весь текст. Но \n так и остается.
Еще раз отмечу и в trace, и в текстовом поле результат аналогичный.
Я естественно придумал обходной путь. Но всё же интересно в чем косяк.

Wolsh
07.04.2018, 17:21
Какой-то там текст\u000AТекст с другой строки

Godwarlock
07.04.2018, 20:35
Wolsh Не сработало. Также в сплошную вбивает.

Wolsh
07.04.2018, 21:25
Странно..

33214

Godwarlock
07.04.2018, 21:29
Wolsh тут обращение к XML. А у меня к XMLList
private var ui:XMLList;

var lang_ru:XML = Assets.config.getXML("lang-ru");
ui = lang_ru.ui;
var result:String = ui.txt_test;
trace(result);

Wolsh
07.04.2018, 21:37
Да без разницы. XMLList содержит ссылки на объекты XML.

33215

Godwarlock
07.04.2018, 22:10
Понятия не имею в чем проблема. Не работает и всё.
Так и пишется
Какой-то там текст\u000AТекст с другой строки
Что в трейсе, что текстифилде. xml загружается через bulkloader

caseyryan
08.04.2018, 18:50
Сделай минимальный работающий пример, и выложи сюда.
Наверняка у тебя какая-то пробелма в коде.

Godwarlock
08.04.2018, 21:23
Ну вот пример.

in4core
08.04.2018, 22:09
[cdata] <br> на кройняк

Wolsh
08.04.2018, 22:17
Ну вот пример.TestText.rar: The archive is either in unknown format or damaged

Godwarlock
08.04.2018, 22:25
Wolsh у меня нормально скачалось и открылось. В 7zip запаковал

Wolsh
08.04.2018, 22:47
Чето у меня все-равно не открывается, но это не суть важно, ибо мой пример тоже не работает при загрузке XML извне через URLLoader. Всмысле, тоже не переносит.

undefined
09.04.2018, 09:40
А если использовать вместо /n другой символ и после загрузки подменять его на /n?

caseyryan
09.04.2018, 10:02
В качестве догадки могу предположить, что при конвертации текста в XML делается экранирование спецсимволов, чтобы этот \n попал в текст как есть. Тобишь на выходе получается не \n, а \\n, но трейсится, естественно, как простой \n
Попробуй в коде, который читает текст, сделать так:

text = text.replace("\\n", "\n");

И посмотри, перенесет ли
TestText.rar: The archive is either in unknown format or damaged

Та же хрень

ZergMaster
09.04.2018, 12:39
А можно сделать соувсем уж извращение. Добавить в xml строку какой-нибудь левый разделитель, вместо \n, например #. И потом, при постановке в текстовое поле делать что-то вроде

textField.text = makeWordWrap(xmlText);

function makeWordWrap(xmlText:String, delim:String='#'):String
{
var result:String = '';
xmlText.split(delim).forEach(function (item:String. i:int, arr:Array)
{
var newLine:String = i ? '\n' : '';
result += newLine+item;
});

return result;
}

undefined
09.04.2018, 12:49
В качестве догадки могу предположить, что при конвертации текста в XML делается экранирование спецсимволов, чтобы этот \n попал в текст как есть. Тобишь на выходе получается не \n, а \\n, но трейсится, естественно, как простой \n


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

caseyryan
09.04.2018, 12:52
Как я понял засада что если грузить данные извне,то перенос не засчитывается, а при хардкоде строки ручками все ок.

Потому что срабатывает штатный XML парсер, и добавляет экраны ко всем спецсимволам

in4core
09.04.2018, 12:55
Да сделайте сдата в конце концов! Что за детский сад

Wolsh
09.04.2018, 13:16
и добавляет экраны ко всем спецсимволамвсё сложнее: ни replace(), ни indexOf() вообще не находят "\n" в строке.

Добавлено через 18 минут
upd: indexOf() находит "\\n"

undefined
09.04.2018, 13:43
так кто его подставляет то URLLoader или XML?

caseyryan
09.04.2018, 13:46
всё сложнее: ни replace(), ни indexOf() вообще не находят "\n" в строке.

Добавлено через 18 минут
upd: indexOf() находит "\\n"
А если попробовать через юникод? \u000d

Wolsh
09.04.2018, 13:49
так кто его подставляет то URLLoader или XML?URLLoader.
Еще до преобразования data в XML индексОф() находит \\n вместо \n.

Godwarlock
09.04.2018, 13:55
in4core cdata слишком много лишнего мусора в тексте.
Тут всё же прозвучало решение, которое я использовал до всей этой дилемы с загрузкой через loader) Самый простой вариант, это просто вставить символ, который в тексте никогда не будет использоваться и просто подменять его.
public static function getText(text:String):String
{
var str:String = ui[text];
var result:String = "";
for (var i:int = 0; i < str.length;i++ )
{
var char:String = str.charAt(i);
if (char == "$")
{
var replaced:String = char.replace("$", "\n");
result += replaced;
}else
{
result += char;
}
}
return result;
}

caseyryan
09.04.2018, 13:57
попробуй так:

text = text.replace(/\\\n/gi, "\n");

Самому сейчас никак не проверить

in4core cdata слишком много лишнего мусора в тексте.
Тут всё же прозвучало решение, которое я использовал до всей этой дилемы с загрузкой через loader) Самый простой вариант, это просто вставить символ, который в тексте никогда не будет использоваться и просто подменять его.
public static function getText(text:String):String
{
var str:String = ui[text];
var result:String = "";
for (var i:int = 0; i < str.length;i++ )
{
var char:String = str.charAt(i);
if (char == "$")
{
var replaced:String = char.replace("$", "\n");
result += replaced;
}else
{
result += char;
}
}
return result;
}

Жесть) Лучше замени этот г-код на регулярку:
public static function getText(text:String):String {
return ui[text].replace(/\$/gi, "\n");
}